| | FROM node:24-bookworm AS dep-builder |
| | |
| | |
| |
|
| | WORKDIR /app |
| |
|
| | |
| | ARG USE_CHINA_NPM_REGISTRY=0 |
| | RUN \ |
| | set -ex && \ |
| | corepack enable pnpm && \ |
| | if [ "$USE_CHINA_NPM_REGISTRY" = 1 ]; then \ |
| | echo 'use npm mirror' && \ |
| | npm config set registry https://registry.npmmirror.com && \ |
| | yarn config set registry https://registry.npmmirror.com && \ |
| | pnpm config set registry https://registry.npmmirror.com ; \ |
| | fi; |
| |
|
| | COPY ./tsconfig.json /app/ |
| | COPY ./patches /app/patches |
| | COPY ./pnpm-lock.yaml /app/ |
| | COPY ./package.json /app/ |
| |
|
| | |
| | RUN \ |
| | set -ex && \ |
| | export PUPPETEER_SKIP_DOWNLOAD=true && \ |
| | pnpm install --frozen-lockfile && \ |
| | pnpm rb |
| |
|
| | |
| |
|
| | FROM debian:bookworm-slim AS dep-version-parser |
| | |
| | |
| | |
| | |
| |
|
| | WORKDIR /ver |
| | COPY ./package.json /app/ |
| | RUN \ |
| | set -ex && \ |
| | grep -Po '(?<="rebrowser-puppeteer": ")[^\s"]*(?=")' /app/package.json | tee /ver/.puppeteer_version && \ |
| | grep -Po '(?<="@vercel/nft": ")[^\s"]*(?=")' /app/package.json | tee /ver/.nft_version && \ |
| | grep -Po '(?<="fs-extra": ")[^\s"]*(?=")' /app/package.json | tee /ver/.fs_extra_version |
| |
|
| | |
| |
|
| | FROM node:24-bookworm-slim AS docker-minifier |
| | |
| |
|
| | WORKDIR /minifier |
| | COPY --from=dep-version-parser /ver/* /minifier/ |
| |
|
| | ARG USE_CHINA_NPM_REGISTRY=0 |
| | RUN \ |
| | set -ex && \ |
| | if [ "$USE_CHINA_NPM_REGISTRY" = 1 ]; then \ |
| | npm config set registry https://registry.npmmirror.com && \ |
| | yarn config set registry https://registry.npmmirror.com && \ |
| | pnpm config set registry https://registry.npmmirror.com ; \ |
| | fi; \ |
| | npm install -g corepack@latest && \ |
| | corepack enable pnpm && \ |
| | pnpm add @vercel/nft@$(cat .nft_version) fs-extra@$(cat .fs_extra_version) --save-prod |
| |
|
| | COPY . /app |
| | COPY --from=dep-builder /app /app |
| |
|
| | WORKDIR /app |
| | RUN \ |
| | set -ex && \ |
| | pnpm build && \ |
| | rm -rf /app/lib && \ |
| | cp /app/scripts/docker/minify-docker.js /minifier/ && \ |
| | export PROJECT_ROOT=/app && \ |
| | node /minifier/minify-docker.js && \ |
| | rm -rf /app/node_modules /app/scripts && \ |
| | mv /app/app-minimal/node_modules /app/ && \ |
| | rm -rf /app/app-minimal && \ |
| | ls -la /app && \ |
| | du -hd1 /app |
| |
|
| | |
| |
|
| | FROM node:24-bookworm-slim AS chromium-downloader |
| | |
| | |
| |
|
| | WORKDIR /app |
| | COPY ./.puppeteerrc.cjs /app/ |
| | COPY --from=dep-version-parser /ver/.puppeteer_version /app/.puppeteer_version |
| |
|
| | ARG TARGETPLATFORM |
| | ARG USE_CHINA_NPM_REGISTRY=0 |
| | ARG PUPPETEER_SKIP_DOWNLOAD=1 |
| | |
| | |
| | RUN \ |
| | set -ex ; \ |
| | if [ "$PUPPETEER_SKIP_DOWNLOAD" = 0 ] && [ "$TARGETPLATFORM" = 'linux/amd64' ]; then \ |
| | if [ "$USE_CHINA_NPM_REGISTRY" = 1 ]; then \ |
| | npm config set registry https://registry.npmmirror.com && \ |
| | yarn config set registry https://registry.npmmirror.com && \ |
| | pnpm config set registry https://registry.npmmirror.com ; \ |
| | fi; \ |
| | echo 'Downloading Chromium...' && \ |
| | unset PUPPETEER_SKIP_DOWNLOAD && \ |
| | corepack enable pnpm && \ |
| | pnpm --allow-build=rebrowser-puppeteer add rebrowser-puppeteer@$(cat /app/.puppeteer_version) --save-prod && \ |
| | pnpm rb && \ |
| | pnpx rebrowser-puppeteer browsers install chrome ; \ |
| | else \ |
| | mkdir -p /app/node_modules/.cache/puppeteer ; \ |
| | fi; |
| |
|
| | |
| |
|
| | FROM node:24-bookworm-slim AS app |
| |
|
| | LABEL org.opencontainers.image.authors="https://github.com/DIYgod/RSSHub" |
| |
|
| | ENV NODE_ENV=production |
| | ENV TZ=Asia/Shanghai |
| |
|
| | WORKDIR /app |
| |
|
| | |
| | ARG TARGETPLATFORM |
| | ARG PUPPETEER_SKIP_DOWNLOAD=1 |
| | |
| | |
| | |
| | |
| | |
| | |
| | RUN \ |
| | set -ex && \ |
| | apt-get update && \ |
| | apt-get install -yq --no-install-recommends \ |
| | dumb-init git curl \ |
| | ; \ |
| | if [ "$PUPPETEER_SKIP_DOWNLOAD" = 0 ]; then \ |
| | if [ "$TARGETPLATFORM" = 'linux/amd64' ]; then \ |
| | apt-get install -yq --no-install-recommends \ |
| | ca-certificates fonts-liberation wget xdg-utils \ |
| | libasound2 libatk-bridge2.0-0 libatk1.0-0 libatspi2.0-0 libcairo2 libcups2 libdbus-1-3 libdrm2 \ |
| | libexpat1 libgbm1 libglib2.0-0 libnspr4 libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 \ |
| | libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 \ |
| | ; \ |
| | else \ |
| | apt-get install -yq --no-install-recommends \ |
| | chromium \ |
| | && \ |
| | echo "CHROMIUM_EXECUTABLE_PATH=$(which chromium)" | tee /app/.env ; \ |
| | fi; \ |
| | apt-get install -yq --no-install-recommends \ |
| | xvfb procps \ |
| | ; \ |
| | fi; \ |
| | rm -rf /var/lib/apt/lists/* |
| |
|
| | COPY --from=chromium-downloader /app/node_modules/.cache/puppeteer /app/node_modules/.cache/puppeteer |
| |
|
| | RUN \ |
| | set -ex && \ |
| | if [ "$PUPPETEER_SKIP_DOWNLOAD" = 0 ] && [ "$TARGETPLATFORM" = 'linux/amd64' ]; then \ |
| | echo 'Verifying Chromium installation...' && \ |
| | _chrome_path=$(find /app/node_modules/.cache/puppeteer/chrome/ -name chrome -xtype f -executable | head -n1) && \ |
| | echo "CHROMIUM_EXECUTABLE_PATH=$_chrome_path" | tee /app/.env && \ |
| | if ldd "$_chrome_path" | grep "not found"; then \ |
| | echo "!!! Chromium has unmet shared libs !!!" && \ |
| | exit 1 ; \ |
| | else \ |
| | echo "Awesome! All shared libs are met!" ; \ |
| | fi; \ |
| | fi; |
| |
|
| | COPY --from=docker-minifier /app /app |
| |
|
| | EXPOSE 1200 |
| | ENTRYPOINT ["dumb-init", "--"] |
| |
|
| | CMD ["npm", "run", "start"] |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| |
|