| # debian.sh --arch 'amd64' out/ 'bookworm' '@1777939200' |
| ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin |
| ENV LANG=C.UTF-8 |
| RUN /bin/sh -c set -eux; apt-get update; apt-get install -y --no-install-recommends ca-certificates netbase tzdata ; rm -rf /var/lib/apt/lists/* # buildkit |
| ENV GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D |
| ENV PYTHON_VERSION=3.11.15 |
| ENV PYTHON_SHA256=272179ddd9a2e41a0fc8e42e33dfbdca0b3711aa5abf372d3f2d51543d09b625 |
| RUN /bin/sh -c set -eux; savedAptMark="$(apt-mark showmanual)"; apt-get update; apt-get install -y --no-install-recommends dpkg-dev gcc gnupg libbluetooth-dev libbz2-dev libc6-dev libdb-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev make tk-dev uuid-dev wget xz-utils zlib1g-dev ; wget -O python.tar.xz "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz"; echo "$PYTHON_SHA256 *python.tar.xz" | sha256sum -c -; wget -O python.tar.xz.asc "https://www.python.org/ftp/python/${PYTHON_VERSION%%[a-z]*}/Python-$PYTHON_VERSION.tar.xz.asc"; GNUPGHOME="$(mktemp -d)"; export GNUPGHOME; gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$GPG_KEY"; gpg --batch --verify python.tar.xz.asc python.tar.xz; gpgconf --kill all; rm -rf "$GNUPGHOME" python.tar.xz.asc; mkdir -p /usr/src/python; tar --extract --directory /usr/src/python --strip-components=1 --file python.tar.xz; rm python.tar.xz; cd /usr/src/python; gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; ./configure --build="$gnuArch" --enable-loadable-sqlite-extensions --enable-optimizations --enable-option-checking=fatal --enable-shared $(test "${gnuArch%%-*}" != 'riscv64' && echo '--with-lto') --with-ensurepip ; nproc="$(nproc)"; EXTRA_CFLAGS="$(dpkg-buildflags --get CFLAGS)"; LDFLAGS="$(dpkg-buildflags --get LDFLAGS)"; LDFLAGS="${LDFLAGS:-} -Wl,--strip-all"; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-}" ; rm python; make -j "$nproc" "EXTRA_CFLAGS=${EXTRA_CFLAGS:-}" "LDFLAGS=${LDFLAGS:-} -Wl,-rpath='\$\$ORIGIN/../lib'" python ; make install; cd /; rm -rf /usr/src/python; find /usr/local -depth \( \( -type d -a \( -name test -o -name tests -o -name idle_test \) \) -o \( -type f -a \( -name '*.pyc' -o -name '*.pyo' -o -name 'libpython*.a' \) \) \) -exec rm -rf '{}' + ; ldconfig; apt-mark auto '.*' > /dev/null; apt-mark manual $savedAptMark; find /usr/local -type f -executable -not \( -name '*tkinter*' \) -exec ldd '{}' ';' | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); printf "*%s\n", so }' | sort -u | xargs -rt dpkg-query --search | awk 'sub(":$", "", $1) { print $1 }' | sort -u | xargs -r apt-mark manual ; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; rm -rf /var/lib/apt/lists/*; export PYTHONDONTWRITEBYTECODE=1; python3 --version; pip3 install --disable-pip-version-check --no-cache-dir --no-compile 'setuptools==79.0.1' 'wheel<0.46' ; pip3 --version # buildkit |
| RUN /bin/sh -c set -eux; for src in idle3 pip3 pydoc3 python3 python3-config; do dst="$(echo "$src" | tr -d 3)"; [ -s "/usr/local/bin/$src" ]; [ ! -e "/usr/local/bin/$dst" ]; ln -svT "$src" "/usr/local/bin/$dst"; done # buildkit |
| CMD ["python3"] |
| LABEL name=archivebox maintainer=Nick Sweeting <dockerfile@archivebox.io> description=All-in-one personal internet archiving container homepage=https://github.com/ArchiveBox/ArchiveBox documentation=https://github.com/ArchiveBox/ArchiveBox/wiki/Docker#docker |
| ARG TARGETPLATFORM=linux/amd64 |
| ARG TARGETOS=linux |
| ARG TARGETARCH=amd64 |
| ARG TARGETVARIANT= |
| ENV TZ=UTC LANGUAGE=en_US:en LC_ALL=C.UTF-8 LANG=C.UTF-8 DEBIAN_FRONTEND=noninteractive APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1 PYTHONIOENCODING=UTF-8 PYTHONUNBUFFERED=1 PIP_DISABLE_PIP_VERSION_CHECK=1 npm_config_loglevel=error |
| ENV PYTHON_VERSION=3.11 NODE_VERSION=24 PLAYWRIGHT_VERSION=1.59.0 YTDLP_VERSION=2026.3.17 GOSU_VERSION=1.19 |
| ENV ARCHIVEBOX_USER=archivebox DEFAULT_PUID=911 DEFAULT_PGID=911 |
| ENV CODE_DIR=/app DATA_DIR=/data GLOBAL_VENV=/venv PLAYWRIGHT_BROWSERS_PATH=/browsers |
| ENV APP_VENV=/app/.venv NODE_MODULES=/app/node_modules |
| ENV PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/venv/bin:/app/.venv/bin:/app/node_modules/.bin |
| SHELL [/bin/bash -o pipefail -o errexit -o errtrace -o nounset -c] |
| COPY --chown=root:root --chmod=755 package.json /app/ # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c grep '"version": ' "${CODE_DIR}/package.json" | awk -F'"' '{print $4}' > /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache && rm -f /etc/apt/apt.conf.d/docker-clean # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c (echo "[i] Docker build for ArchiveBox $(cat /VERSION.txt) starting..." && echo "PLATFORM=${TARGETPLATFORM} ARCH=$(uname -m) ($(uname -s) ${TARGETARCH} ${TARGETVARIANT})" && echo "BUILD_START_TIME=$(date +"%Y-%m-%d %H:%M:%S %s") TZ=${TZ} LANG=${LANG}" && echo && echo "GLOBAL_VENV=${GLOBAL_VENV} APP_VENV=${APP_VENV} NODE_MODULES=${NODE_MODULES}" && echo "PYTHON=${PYTHON_VERSION} NODE=${NODE_VERSION} PATH=${PATH}" && echo "CODE_DIR=${CODE_DIR} DATA_DIR=${DATA_DIR}" && echo && uname -a && cat /etc/os-release | head -n7 && which bash && bash --version | head -n1 && which dpkg && dpkg --version | head -n1 && echo -e '\n\n' && env && echo -e '\n\n' ) | tee -a /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[*] Setting up $ARCHIVEBOX_USER user uid=${DEFAULT_PUID}..." && groupadd --system $ARCHIVEBOX_USER && useradd --system --create-home --gid $ARCHIVEBOX_USER --groups audio,video $ARCHIVEBOX_USER && usermod -u "$DEFAULT_PUID" "$ARCHIVEBOX_USER" && groupmod -g "$DEFAULT_PGID" "$ARCHIVEBOX_USER" && echo -e "\nARCHIVEBOX_USER=$ARCHIVEBOX_USER PUID=$(id -u $ARCHIVEBOX_USER) PGID=$(id -g $ARCHIVEBOX_USER)\n\n" | tee -a /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[+] Installing APT base system dependencies for $TARGETPLATFORM..." && echo 'deb https://deb.debian.org/debian bookworm-backports main contrib non-free' >> /etc/apt/sources.list.d/backports.list && mkdir -p /etc/apt/keyrings && apt-get update -qq && apt-get install -qq -y -t bookworm-backports --no-install-recommends apt-transport-https ca-certificates apt-utils gnupg2 curl wget zlib1g-dev dumb-init cron unzip grep && rm -rf /var/lib/apt/lists/* && case "$TARGETARCH/$TARGETVARIANT" in amd64/) GOSU_ARCH=amd64; GOSU_SHA256=52c8749d0142edd234e9d6bd5237dff2d81e71f43537e2f4f66f75dd4b243dd0 ;; arm64/) GOSU_ARCH=arm64; GOSU_SHA256=3a8ef022d82c0bc4a98bcb144e77da714c25fcfa64dccc57f6aba7ae47ff1a44 ;; arm/v7) GOSU_ARCH=armhf; GOSU_SHA256=8457a0bfd28e016c2c7d8ea6e5f7eed1376033ffbd36491bb455094c8b1dc9fd ;; *) echo "Unsupported gosu platform: $TARGETARCH/$TARGETVARIANT"; exit 1 ;; esac && curl -fsSL -o /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$GOSU_ARCH" && echo "$GOSU_SHA256 /usr/local/bin/gosu" | sha256sum -c - && chmod +x /usr/local/bin/gosu && gosu --version | head -n1 | tee -a /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[+] Installing Node $NODE_VERSION environment in $NODE_MODULES..." && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_${NODE_VERSION}.x nodistro main" >> /etc/apt/sources.list.d/nodejs.list && curl -fsSL "https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key" | gpg --dearmor | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && apt-get update -qq && apt-get install -qq -y -t bookworm-backports --no-install-recommends nodejs libatomic1 python3-minimal && rm -rf /var/lib/apt/lists/* && npm i -g npm --cache /root/.npm && ( which node && node --version && which npm && npm --version && echo -e '\n\n' ) | tee -a /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[+] Setting up Python $PYTHON_VERSION runtime..." && ( which python3 && python3 --version | grep " $PYTHON_VERSION" && which pip && pip --version && echo -e '\n\n' ) | tee -a /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[+] Installing APT extractor dependencies globally using apt..." && apt-get update -qq && apt-get install -qq -y -t bookworm-backports --no-install-recommends curl wget git ffmpeg ripgrep && rm -rf /var/lib/apt/lists/* && ( which curl && curl --version | head -n1 && which wget && wget --version 2>&1 | head -n1 && which git && git --version 2>&1 | head -n1 && which rg && rg --version 2>&1 | head -n1 && echo -e '\n\n' ) | tee -a /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[+] Installing Browser binary dependencies to $PLAYWRIGHT_BROWSERS_PATH..." && apt-get update -qq && if [[ "$TARGETPLATFORM" == *amd64* || "$TARGETPLATFORM" == *arm64* ]]; then pip install "playwright==$PLAYWRIGHT_VERSION" && cp -r /root/.cache/ms-playwright "$PLAYWRIGHT_BROWSERS_PATH" && playwright install --with-deps chromium && export CHROME_BINARY="$(python -c 'from playwright.sync_api import sync_playwright; print(sync_playwright().start().chromium.executable_path)')"; else apt-get install -qq -y -t bookworm-backports --no-install-recommends chromium fontconfig fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-symbola fonts-noto fonts-freefont-ttf && export CHROME_BINARY="$(which chromium)"; fi && rm -rf /var/lib/apt/lists/* && ln -s "$CHROME_BINARY" /usr/bin/chromium-browser && mkdir -p "/home/${ARCHIVEBOX_USER}/.config/chromium/Crash Reports/pending/" && chown -R $ARCHIVEBOX_USER "/home/${ARCHIVEBOX_USER}/.config" && mkdir -p "$PLAYWRIGHT_BROWSERS_PATH" && chown -R $ARCHIVEBOX_USER "$PLAYWRIGHT_BROWSERS_PATH" && ( which chromium-browser && /usr/bin/chromium-browser --version || /usr/lib/chromium/chromium --version && echo -e '\n\n' ) | tee -a /VERSION.txt # buildkit |
| WORKDIR /app |
| COPY --chown=root:root --chmod=755 package.json package-lock.json /app/ # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[+] Installing NPM extractor dependencies from package.json into $NODE_MODULES..." && npm ci --prefer-offline --no-audit --cache /root/.npm && ( which node && node --version && which npm && npm version && echo -e '\n\n' ) | tee -a /VERSION.txt # buildkit |
| WORKDIR /app |
| COPY --chown=root:root --chmod=755 ./pyproject.toml requirements.txt /app/ # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[+] Installing PIP ArchiveBox dependencies from requirements.txt for ${TARGETPLATFORM}..." && apt-get update -qq && apt-get install -qq -y -t bookworm-backports --no-install-recommends build-essential libssl-dev libldap2-dev libsasl2-dev python3-ldap python3-msgpack python3-mutagen python3-regex python3-pycryptodome procps && pip install -r requirements.txt && pip install --upgrade "yt-dlp==$YTDLP_VERSION" && apt-get purge -y build-essential && apt-get autoremove -y && rm -rf /var/lib/apt/lists/* # buildkit |
| COPY --chown=root:root --chmod=755 . /app/ # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c echo "[*] Installing PIP ArchiveBox package from $CODE_DIR..." && pip install -e "$CODE_DIR"[sonic,ldap] && rm -rf /var/lib/apt/lists/* # buildkit |
| WORKDIR /data |
| ENV IN_DOCKER=True |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c (echo -e "\n\n[√] Finished Docker build succesfully. Saving build summary in: /VERSION.txt" && echo -e "PLATFORM=${TARGETPLATFORM} ARCH=$(uname -m) ($(uname -s) ${TARGETARCH} ${TARGETVARIANT})\n" && echo -e "BUILD_END_TIME=$(date +"%Y-%m-%d %H:%M:%S %s")\n\n" ) | tee -a /VERSION.txt # buildkit |
| RUN |4 TARGETPLATFORM=linux/amd64 TARGETOS=linux TARGETARCH=amd64 TARGETVARIANT= /bin/bash -o pipefail -o errexit -o errtrace -o nounset -c "$CODE_DIR"/bin/docker_entrypoint.sh version 2>&1 | tee -a /VERSION.txt # buildkit |
| WORKDIR /data |
| VOLUME [/data] |
| EXPOSE [8000/tcp] |
| ENTRYPOINT ["dumb-init" "--" "/app/bin/docker_entrypoint.sh"] |
| CMD ["archivebox" "server" "--quick-init" "0.0.0.0:8000"] |