mirror of
https://github.com/whyour/qinglong.git
synced 2026-11-02 06:58:52 +08:00
137 lines
4.6 KiB
Docker
137 lines
4.6 KiB
Docker
# Run Node package installation natively on the builder. Node/npm can spin at
|
|
# 100% CPU when Alpine s390x is emulated through QEMU.
|
|
FROM --platform=$BUILDPLATFORM node:24.18.1-alpine3.24 AS builder
|
|
|
|
ARG TARGETARCH
|
|
ARG TARGETVARIANT
|
|
ENV NPM_CONFIG_PREFIX=/opt/node-global
|
|
ENV PATH=/opt/node-global/bin:${PATH}
|
|
|
|
COPY package.json .npmrc pnpm-lock.yaml /tmp/build/
|
|
RUN set -x \
|
|
&& apk add --no-cache git \
|
|
&& npm i -g pnpm@8.3.1 pm2 ts-node typescript@5 \
|
|
&& cd /tmp/build \
|
|
&& case "${TARGETARCH}" in \
|
|
amd64) NODE_ARCH=x64 ;; \
|
|
386) NODE_ARCH=ia32 ;; \
|
|
ppc64le) NODE_ARCH=ppc64 ;; \
|
|
*) NODE_ARCH="${TARGETARCH}" ;; \
|
|
esac \
|
|
&& case "${TARGETARCH}/${TARGETVARIANT:-}" in \
|
|
arm/v6) NODE_LIBC=musl-armv6 ;; \
|
|
arm/v7) NODE_LIBC=musl-armv7 ;; \
|
|
arm/*) echo "Unsupported ARM variant: ${TARGETVARIANT:-unknown}" >&2; exit 1 ;; \
|
|
*) NODE_LIBC=musl ;; \
|
|
esac \
|
|
&& npm_config_target_platform=linux \
|
|
npm_config_target_arch="${NODE_ARCH}" \
|
|
npm_config_target_libc="${NODE_LIBC}" \
|
|
pnpm install --prod --frozen-lockfile --side-effects-cache=false
|
|
|
|
# Pin amd64 to upstream's musl runtime after native URL parser crashes with APK Node.
|
|
FROM --platform=linux/amd64 node:24.18.1-alpine3.24@sha256:f70403e87646dc51b45295f4b8b70cdad0b63d2297c4c9899119b03f7af7a6b3 AS node-runtime-amd64
|
|
|
|
FROM python:3.11-alpine3.24
|
|
|
|
ARG TARGETARCH
|
|
ARG TARGETVARIANT
|
|
|
|
ARG QL_MAINTAINER="whyour"
|
|
LABEL maintainer="${QL_MAINTAINER}"
|
|
ARG QL_URL=https://github.com/${QL_MAINTAINER}/qinglong.git
|
|
ARG QL_BRANCH=develop
|
|
ARG PYTHON_SHORT_VERSION=3.11
|
|
|
|
ENV QL_DIR=/ql \
|
|
QL_BRANCH=${QL_BRANCH} \
|
|
QL_CONTAINER=true \
|
|
LANG=C.UTF-8 \
|
|
SHELL=/bin/bash \
|
|
PS1="\u@\h:\w \$ "
|
|
|
|
VOLUME /ql/data
|
|
|
|
EXPOSE 5700
|
|
|
|
COPY --from=builder /opt/node-global/lib/node_modules/. /usr/local/lib/node_modules/
|
|
COPY --from=builder /opt/node-global/bin/. /usr/local/bin/
|
|
|
|
RUN --mount=type=bind,from=node-runtime-amd64,source=/usr/local/bin/node,target=/tmp/node-runtime-amd64 \
|
|
set -x \
|
|
&& apk update -f \
|
|
&& apk upgrade \
|
|
&& apk --no-cache add -f bash \
|
|
coreutils \
|
|
git \
|
|
curl \
|
|
wget \
|
|
tzdata \
|
|
perl \
|
|
openssl \
|
|
nodejs \
|
|
jq \
|
|
openssh \
|
|
procps \
|
|
netcat-openbsd \
|
|
unzip \
|
|
npm \
|
|
&& if [ "$TARGETARCH" = amd64 ]; then \
|
|
cp /tmp/node-runtime-amd64 /usr/local/bin/node; \
|
|
ln -sf /usr/local/bin/node /usr/bin/node; \
|
|
fi \
|
|
&& node --version | grep -E '^v24\.' \
|
|
&& rm -rf /var/cache/apk/* \
|
|
&& apk update \
|
|
&& ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
|
|
&& echo "Asia/Shanghai" > /etc/timezone \
|
|
&& git config --global user.email "qinglong@users.noreply.github.com" \
|
|
&& git config --global user.name "qinglong" \
|
|
&& git config --global http.postBuffer 524288000 \
|
|
&& rm -rf /root/.cache \
|
|
&& ulimit -c 0
|
|
|
|
ARG SOURCE_COMMIT
|
|
LABEL org.opencontainers.image.revision=${SOURCE_COMMIT}
|
|
RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
|
|
&& cd ${QL_DIR} \
|
|
&& if [ -n "${SOURCE_COMMIT}" ]; then git fetch --depth=1 origin "${SOURCE_COMMIT}" && git reset --hard FETCH_HEAD; fi \
|
|
&& cp -f .env.example .env \
|
|
&& chmod 777 ${QL_DIR}/shell/*.sh \
|
|
&& chmod 777 ${QL_DIR}/docker/*.sh
|
|
|
|
# Downloaded by CI from the build-static job in this workflow run.
|
|
COPY static/ /ql/static/
|
|
COPY docker/verify-build.cjs docker/build-manifest.cjs /tmp/
|
|
COPY --from=builder /tmp/build/pnpm-lock.yaml /tmp/dependency-lock.yaml
|
|
RUN cd ${QL_DIR} && node /tmp/verify-build.cjs /tmp/dependency-lock.yaml
|
|
RUN if [ "$TARGETARCH" = arm ] && [ "${TARGETVARIANT:-}" = v6 ]; then \
|
|
QEMU_CPU=arm1176 node --jitless ${QL_DIR}/shell/node-runtime-probe.cjs; \
|
|
else node ${QL_DIR}/shell/node-runtime-probe.cjs; fi
|
|
|
|
|
|
ENV PNPM_HOME=${QL_DIR}/data/dep_cache/node \
|
|
PYTHON_HOME=${QL_DIR}/data/dep_cache/python3 \
|
|
PYTHONUSERBASE=${QL_DIR}/data/dep_cache/python3 \
|
|
HOME=/root
|
|
|
|
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PNPM_HOME}:${PYTHON_HOME}/bin:${HOME}/bin \
|
|
NODE_PATH=/usr/local/bin:/usr/local/lib/node_modules \
|
|
PIP_CACHE_DIR=${PYTHON_HOME}/pip \
|
|
PYTHONPATH=${PYTHON_HOME}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}/site-packages
|
|
|
|
RUN pip3 install --prefix ${PYTHON_HOME} requests
|
|
|
|
COPY --from=builder /tmp/build/node_modules/. /ql/node_modules/
|
|
|
|
RUN ln -sf ${QL_DIR}/shell/task.sh /usr/local/bin/task \
|
|
&& ln -sf ${QL_DIR}/shell/update.sh /usr/local/bin/ql \
|
|
&& chmod +x /usr/local/bin/task /usr/local/bin/ql
|
|
|
|
WORKDIR ${QL_DIR}
|
|
|
|
HEALTHCHECK --interval=5s --timeout=2s --retries=20 \
|
|
CMD curl -sf --noproxy '*' http://localhost:${QlPort:-5700}/api/health || exit 1
|
|
|
|
ENTRYPOINT ["./docker/docker-entrypoint.sh"]
|