# Build biliup's web-ui
FROM node:lts AS webui-builder
ARG repo_url=https://github.com/biliup/biliup
ARG branch_name=master
COPY . /biliup
RUN set -eux; \
if [ ! -f /biliup/biliup.spec ]; then \
rm -rf /biliup; \
git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \
fi;
WORKDIR /biliup
RUN set -eux; \
npm install; \
npm run build;
# Build biliup's python wheel
FROM rust:latest AS wheel-builder
ARG repo_url=https://github.com/biliup/biliup
ARG branch_name=master
COPY . /biliup
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends python3-pip g++; \
pip3 install maturin --break-system-packages; \
if [ ! -f /biliup/biliup.spec ]; then \
rm -rf /biliup; \
git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \
fi;
COPY --from=webui-builder /biliup/out /biliup/out
WORKDIR /biliup
RUN set -eux; \
maturin build --release;
# Deploy Biliup
FROM python:3.13-slim AS biliup
ENV TZ="Asia/Shanghai"
ENV LANG="C.UTF-8"
ENV LANGUAGE="C.UTF-8"
ENV LC_ALL="C.UTF-8"
EXPOSE 19159/tcp
VOLUME /opt
# 需要遵守 wheel 文件名规范
COPY --from=wheel-builder /biliup/target/wheels/* /tmp/
RUN set -eux; \
\
whl=$(ls /tmp/biliup*.whl); \
pip3 install --no-cache-dir "$whl"; \
# pip3 install --no-cache-dir "$whl[quickjs]"; \
pip3 cache purge; \
rm -rf /tmp/*;
RUN set -eux; \
\
savedAptMark="$(apt-mark showmanual)"; \
useApt=false; \
apt-get update; \
apt-get install -y --no-install-recommends \
wget \
curl \
xz-utils \
g++ \
; \
apt-mark auto '.*' > /dev/null; \
apt-mark manual curl wget; \
\
arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; \
url='https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n8.0-latest-'; \
case "$arch" in \
'amd64') \
url="${url}linux64-gpl-8.0.tar.xz"; \
;; \
'arm64') \
url="${url}linuxarm64-gpl-8.0.tar.xz"; \
;; \
*) \
useApt=true; \
;; \
esac; \
\
if [ "$useApt" = true ] ; then \
apt-get install -y --no-install-recommends \
ffmpeg \
; \
else \
wget -O ffmpeg.tar.xz "$url" --progress=dot:giga; \
tar -xJf ffmpeg.tar.xz -C /usr/local --strip-components=1; \
rm -rf \
/usr/local/doc \
/usr/local/man; \
rm -rf \
/usr/local/bin/ffprobe \
/usr/local/bin/ffplay; \
rm -rf \
ffmpeg*; \
chmod a+x /usr/local/* ; \
fi; \
\
# 安装 quickjs 需要 g++
pip3 install --no-cache-dir quickjs; \
\
# Clean up \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf \
/tmp/* \
/usr/share/doc/* \
/var/cache/* \
/var/lib/apt/lists/* \
/var/tmp/* \
/var/log/* \
;
WORKDIR /opt
ENTRYPOINT ["biliup"]
node_modules build dist .babelcache .git .github .dockerignore .DS_Store
Summary (under 1500 chars):
- Exact error message and exit code
- 404 Not Found (from wget)
- Exit code: 8
- Context: The log shows “ERROR 404: Not Found.” and later the build step reports exit code 8 for the failing command.
- Failing command/step
- Failing step: [biliup 4/5] RUN set -eux; savedAptMark="$(apt-mark showmanual)"; useApt=false; apt-get update; apt-get install -y --no-install-recommends wget curl xz-utils g++; ... arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; url='https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n8.0-latest-'; case "$arch" in 'amd64') url="${url}linux64-gpl-8.0.tar.xz";; 'arm64') url="${url}linuxarm64-gpl-8.0.tar.xz";; *) useApt=true; esac; ... if [ "$useApt" = true ] ; then apt-get install -y --no-install-recommends ffmpeg ; else wget -O ffmpeg.tar.xz "$url" --progress=dot:giga; tar -xJf ffmpeg.tar.xz -C /usr/local --strip-components=1; ...; fi; ...;
- The wget invocation that failed (from the log) is:
wget -O ffmpeg.tar.xz "$url" --progress=dot:giga
- Missing packages or files mentioned
- The missing file is the FFmpeg tarball at the URL:
https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n8.0-latest-linux64-gpl-8.0.tar.xz
- HTTP 404 indicates that specific file/version is not found on the server.
- Version mismatch info
- The script is trying to download ffmpeg-n8.0-latest-linux64-gpl-8.0.tar.xz (FFmpeg 8.0 for amd64). The 404 suggests this exact release/build is not available (mismatch between requested version and what exists at that URL, or the “latest” tag no longer hosts that file for amd64).# Build biliup's web-ui
FROM node:lts AS webui-builder
ARG repo_url=https://github.com/biliup/biliup
ARG branch_name=master
COPY . /biliup
RUN set -eux; \
if [ ! -f /biliup/biliup.spec ]; then \
rm -rf /biliup; \
git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \
fi;
WORKDIR /biliup
RUN set -eux; \
npm install; \
npm run build;
# Build biliup's python wheel
FROM rust:latest AS wheel-builder
ARG repo_url=https://github.com/biliup/biliup
ARG branch_name=master
COPY . /biliup
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends python3-pip g++; \
pip3 install maturin --break-system-packages; \
if [ ! -f /biliup/biliup.spec ]; then \
rm -rf /biliup; \
git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \
fi;
COPY --from=webui-builder /biliup/out /biliup/out
WORKDIR /biliup
RUN set -eux; \
maturin build --release;
# Deploy Biliup
FROM python:3.13-slim AS biliup
ENV TZ="Asia/Shanghai"
ENV LANG="C.UTF-8"
ENV LANGUAGE="C.UTF-8"
ENV LC_ALL="C.UTF-8"
EXPOSE 19159/tcp
VOLUME /opt
# 需要遵守 wheel 文件名规范
COPY --from=wheel-builder /biliup/target/wheels/* /tmp/
RUN set -eux; \
\
whl=$(ls /tmp/biliup*.whl); \
pip3 install --no-cache-dir "$whl"; \
# pip3 install --no-cache-dir "$whl[quickjs]"; \
pip3 cache purge; \
rm -rf /tmp/*;
RUN set -eux; \
\
savedAptMark="$(apt-mark showmanual)"; \
useApt=false; \
apt-get update; \
apt-get install -y --no-install-recommends \
wget \
curl \
xz-utils \
g++ \
; \
apt-mark auto '.*' > /dev/null; \
apt-mark manual curl wget; \
\
arch="$(dpkg --print-architecture)"; arch="${arch##*-}"; \
url='https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n8.0-latest-'; \
case "$arch" in \
'amd64') \
url="${url}linux64-gpl-8.0.tar.xz"; \
;; \
'arm64') \
url="${url}linuxarm64-gpl-8.0.tar.xz"; \
;; \
*) \
useApt=true; \
;; \
esac; \
\
if [ "$useApt" = true ] ; then \
apt-get install -y --no-install-recommends \
ffmpeg \
; \
else \
if wget -O ffmpeg.tar.xz "$url" --progress=dot:giga; then \
# downloaded successfully
tar -xJf ffmpeg.tar.xz -C /usr/local --strip-components=1; \
else \
echo "FFmpeg tarball not found at $url, falling back to system ffmpeg"; \
apt-get install -y --no-install-recommends ffmpeg; \
fi; \
rm -rf \
/usr/local/doc \
/usr/local/man; \
rm -rf \
/usr/local/bin/ffprobe \
/usr/local/bin/ffplay; \
rm -rf \
ffmpeg*; \
chmod a+x /usr/local/* ; \
fi; \
\
# 安装 quickjs 需要 g++
pip3 install --no-cache-dir quickjs; \
\
# Clean up \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf \
/tmp/* \
/usr/share/doc/* \
/var/cache/* \
/var/lib/apt/lists/* \
/var/tmp/* \
/var/log/* \
;
WORKDIR /opt
ENTRYPOINT ["biliup"]
Build timed out after 600s
# Build biliup's web-ui FROM node:lts AS webui-builder ARG repo_url=https://github.com/biliup/biliup ARG branch_name=master COPY . /biliup RUN set -eux; \ if [ ! -f /biliup/biliup.spec ]; then \ rm -rf /biliup; \ git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \ fi; WORKDIR /biliup RUN set -eux; \ npm install; \ npm run build; # Build biliup's python wheel FROM rust:latest AS wheel-builder ARG repo_url=https://github.com/biliup/biliup ARG branch_name=master COPY . /biliup RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends python3-pip g++; \ pip3 install maturin --break-system-packages; \ if [ ! -f /biliup/biliup.spec ]; then \ rm -rf /biliup; \ git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \ fi; COPY --from=webui-builder /biliup/out /biliup/out WORKDIR /biliup RUN set -eux; \ maturin build --release; # Deploy Biliup FROM python:3.13-slim AS biliup ENV TZ="Asia/Shanghai" ENV LANG="C.UTF-8" ENV LANGUAGE="C.UTF-8" ENV LC_ALL="C.UTF-8" EXPOSE 19159/tcp VOLUME /opt # 需要遵守 wheel 文件名规范 COPY --from=wheel-builder /biliup/target/wheels/* /tmp/ RUN set -eux; \ \ whl=$(ls /tmp/biliup*.whl); \ pip3 install --no-cache-dir "$whl"; \ # pip3 install --no-cache-dir "$whl[quickjs]"; \ pip3 cache purge; \ rm -rf /tmp/*; RUN set -eux; \ \ # Simplified FFmpeg installation to speed up build and avoid 404s savedAptMark="$(apt-mark showmanual)"; \ apt-get update; \ apt-get install -y --no-install-recommends ffmpeg; \ # Install quickjs as before pip3 install --no-cache-dir quickjs; \ # Clean up [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ rm -rf \ /tmp/* \ /usr/share/doc/* \ /var/cache/* \ /var/lib/apt/lists/* \ /var/tmp/* \ /var/log/* \ ; WORKDIR /opt ENTRYPOINT ["biliup"]
Summary of Docker build error
- Exact error message and exit code
- error: command 'gcc' failed: No such file or directory
- exit code: 1
- Failing command/step
- Stage: biliup 4/5
- Command: RUN set -eux; \
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends ffmpeg; \
pip3 install --no-cache-dir quickjs; \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \
rm -rf /tmp/* /usr/share/doc/* /var/cache/* /var/lib/apt/lists/* /var/tmp/* /var/log/*;
- Missing packages or files mentioned
- GCC (the C compiler) is missing: "No such file or directory" for gcc
- Implication: need a C toolchain (e.g., build-essential with gcc/g++, make) installed before pip install quickjs
- Version mismatch information
- No explicit version mismatch reported. The image uses Node LTS, Python 3.13-slim, and Rust: latest in various stages, but the failure is due to a missing compiler, not a version mismatch.# Build biliup's web-ui FROM node:lts AS webui-builder ARG repo_url=https://github.com/biliup/biliup ARG branch_name=master WORKDIR /biliup # Use repository content if biliup.spec exists, otherwise clone the repo COPY . /biliup RUN set -eux; \ if [ -f /biliup/biliup.spec ]; then \ true; \ else \ rm -rf /biliup; \ git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \ fi; RUN set -eux; \ cd /biliup; \ npm install; \ npm run build; # Build biliup's python wheel FROM rust:latest AS wheel-builder ARG repo_url=https://github.com/biliup/biliup ARG branch_name=master WORKDIR /biliup # Copy source; if biliup.spec exists, we reuse as-is, otherwise clone the repo COPY . /biliup RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends python3-pip build-essential git ca-certificates pkg-config libssl-dev libffi-dev; \ pip3 install maturin --break-system-packages; \ if [ -f /biliup/biliup.spec ]; then \ true; \ else \ rm -rf /biliup; \ git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \ fi; COPY --from=webui-builder /biliup/out /biliup/out WORKDIR /biliup RUN set -eux; \ maturin build --release; # Deploy Biliup FROM python:3.13-slim AS biliup ENV TZ="Asia/Shanghai" ENV LANG="C.UTF-8" ENV LANGUAGE="C.UTF-8" ENV LC_ALL="C.UTF-8" EXPOSE 19159/tcp VOLUME /opt # 需要遵守 wheel 文件名规范 COPY --from=wheel-builder /biliup/target/wheels/* /tmp/ RUN set -eux; \ whl=$(ls /tmp/biliup*.whl); \ pip3 install --no-cache-dir "$whl"; \ # pip3 install --no-cache-dir "$whl[quickjs]"; \ pip3 cache purge; \ rm -rf /tmp/*; RUN set -eux; \ savedAptMark="$(apt-mark showmanual)"; \ apt-get update; \ apt-get install -y --no-install-recommends \ ffmpeg \ wget \ curl \ xz-utils \ g++ \ ; \ apt-mark auto '.*' > /dev/null; \ apt-mark manual curl wget; \ # Install quickjs for Python bindings pip3 install --no-cache-dir quickjs; \ # Clean up \ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ rm -rf \ /tmp/* \ /usr/share/doc/* \ /var/cache/* \ /var/lib/apt/lists/* \ /var/tmp/* \ /var/log/* \ ; WORKDIR /opt ENTRYPOINT ["biliup"]
Build timed out after 600s
# Build biliup's web-ui FROM node:lts AS webui-builder ARG repo_url=https://github.com/biliup/biliup ARG branch_name=master WORKDIR /biliup # Use repository content if biliup.spec exists, otherwise clone the repo COPY . /biliup RUN set -eux; \ if [ -f /biliup/biliup.spec ]; then \ true; \ else \ rm -rf /biliup; \ git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \ fi; RUN set -eux; \ cd /biliup; \ npm install; \ npm run build; # Build biliup's python wheel FROM rust:latest AS wheel-builder ARG repo_url=https://github.com/biliup/biliup ARG branch_name=master WORKDIR /biliup # Copy source; if biliup.spec exists, we reuse as-is, otherwise clone the repo COPY . /biliup RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends python3-pip build-essential git ca-certificates pkg-config libssl-dev libffi-dev; \ pip3 install maturin --break-system-packages; \ if [ -f /biliup/biliup.spec ]; then \ true; \ else \ rm -rf /biliup; \ git clone --depth 1 --branch "$branch_name" "$repo_url" /biliup; \ fi; COPY --from=webui-builder /biliup/out /biliup/out WORKDIR /biliup RUN set -eux; \ maturin build --release; # Deploy Biliup FROM python:3.13-slim AS biliup ENV TZ="Asia/Shanghai" ENV LANG="C.UTF-8" ENV LANGUAGE="C.UTF-8" ENV LC_ALL="C.UTF-8" EXPOSE 19159/tcp VOLUME /opt # 需要遵守 wheel 文件名规范 COPY --from=wheel-builder /biliup/target/wheels/* /tmp/ RUN set -eux; \ whl=$(ls /tmp/biliup*.whl); \ pip3 install --no-cache-dir "$whl"; \ # pip3 install --no-cache-dir "$whl[quickjs]"; \ pip3 cache purge; \ rm -rf /tmp/*; RUN set -eux; \ savedAptMark="$(apt-mark showmanual)"; \ apt-get update; \ apt-get install -y --no-install-recommends \ ffmpeg \ wget \ curl \ xz-utils \ g++ \ ; \ apt-mark auto '.*' > /dev/null; \ apt-mark manual curl wget; \ # Install quickjs for Python bindings pip3 install --no-cache-dir quickjs; \ # Clean up \ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ rm -rf \ /tmp/* \ /usr/share/doc/* \ /var/cache/* \ /var/lib/apt/lists/* \ /var/tmp/* \ /var/log/* \ ; WORKDIR /opt ENTRYPOINT ["biliup"]
Concerns: Potential availability of the python:3.13-slim tag at build time; consider pinning to a concrete, stable minor version to ensure reproducibility., wheel-builder uses rust:latest which can lead to non-deterministic builds; consider pinning a specific Rust version for reproducible builds. Smoke [PASS]: command -v biliup Smoke [PASS]: biliup --help