# Default to pulling from the main repo registry when manually building ARG REPO="paperless-ngx/paperless-ngx" # These are all built previously in the pipeline # They provide either a .deb, .whl or whatever npm outputs ARG JBIG2ENC_VERSION ARG QPDF_VERSION ARG PIKEPDF_VERSION ARG PSYCOPG2_VERSION ARG FRONTEND_VERSION FROM ghcr.io/${REPO}/builder/jbig2enc:${JBIG2ENC_VERSION} as jbig2enc-builder FROM ghcr.io/${REPO}/builder/qpdf:${QPDF_VERSION} as qpdf-builder FROM ghcr.io/${REPO}/builder/pikepdf:${PIKEPDF_VERSION} as pikepdf-builder FROM ghcr.io/${REPO}/builder/psycopg2:${PSYCOPG2_VERSION} as psycopg2-builder FROM ghcr.io/${REPO}/builder/frontend:${FRONTEND_VERSION} as compile-frontend FROM python:3.9-slim-bullseye as main-app LABEL org.opencontainers.image.authors="paperless-ngx team " LABEL org.opencontainers.image.documentation="https://paperless-ngx.readthedocs.io/en/latest/" LABEL org.opencontainers.image.source="https://github.com/paperless-ngx/paperless-ngx" LABEL org.opencontainers.image.url="https://github.com/paperless-ngx/paperless-ngx" LABEL org.opencontainers.image.licenses="GPL-3.0-only" ARG DEBIAN_FRONTEND=noninteractive # Packages needed only for building ARG BUILD_PACKAGES="\ build-essential \ git \ python3-dev" # Packages need for running ARG RUNTIME_PACKAGES="\ curl \ file \ # fonts for text file thumbnail generation fonts-liberation \ gettext \ ghostscript \ gnupg \ gosu \ icc-profiles-free \ imagemagick \ media-types \ liblept5 \ libpq5 \ libxml2 \ liblcms2-2 \ libtiff5 \ libxslt1.1 \ libfreetype6 \ libwebp6 \ libopenjp2-7 \ libimagequant0 \ libraqm0 \ libgnutls30 \ libjpeg62-turbo \ optipng \ python3 \ python3-pip \ python3-setuptools \ postgresql-client \ # For Numpy libatlas3-base \ # thumbnail size reduction pngquant \ # OCRmyPDF dependencies tesseract-ocr \ tesseract-ocr-eng \ tesseract-ocr-deu \ tesseract-ocr-fra \ tesseract-ocr-ita \ tesseract-ocr-spa \ tzdata \ unpaper \ # Mime type detection zlib1g \ # Barcode splitter libzbar0 \ poppler-utils" WORKDIR /usr/src/paperless/src/ # Copy qpdf and runtime library COPY --from=qpdf-builder /usr/src/qpdf/libqpdf28_*.deb ./ COPY --from=qpdf-builder /usr/src/qpdf/qpdf_*.deb ./ # Copy pikepdf wheel and dependencies COPY --from=pikepdf-builder /usr/src/pikepdf/wheels/*.whl ./ # Copy psycopg2 wheel COPY --from=psycopg2-builder /usr/src/psycopg2/wheels/psycopg2*.whl ./ # copy jbig2enc COPY --from=jbig2enc-builder /usr/src/jbig2enc/src/.libs/libjbig2enc* /usr/local/lib/ COPY --from=jbig2enc-builder /usr/src/jbig2enc/src/jbig2 /usr/local/bin/ COPY --from=jbig2enc-builder /usr/src/jbig2enc/src/*.h /usr/local/include/ COPY requirements.txt ../ # Python dependencies RUN set -eux \ && apt-get update \ && apt-get install --yes --quiet --no-install-recommends ${RUNTIME_PACKAGES} ${BUILD_PACKAGES} \ && python3 -m pip install --no-cache-dir --upgrade wheel \ && echo "Installing qpdf" \ && apt-get install --yes --no-install-recommends ./libqpdf28_*.deb \ && apt-get install --yes --no-install-recommends ./qpdf_*.deb \ && echo "Installing pikepdf and dependencies wheel" \ && python3 -m pip install --no-cache-dir packaging*.whl \ && python3 -m pip install --no-cache-dir lxml*.whl \ && python3 -m pip install --no-cache-dir Pillow*.whl \ && python3 -m pip install --no-cache-dir pyparsing*.whl \ && python3 -m pip install --no-cache-dir pikepdf*.whl \ && python -m pip list \ && echo "Installing psycopg2 wheel" \ && python3 -m pip install --no-cache-dir psycopg2*.whl \ && python -m pip list \ && echo "Installing supervisor" \ && python3 -m pip install --default-timeout=1000 --upgrade --no-cache-dir supervisor \ && echo "Installing Python requirements" \ && python3 -m pip install --default-timeout=1000 --no-cache-dir -r ../requirements.txt \ && echo "Cleaning up image" \ && apt-get -y purge ${BUILD_PACKAGES} \ && apt-get -y autoremove --purge \ && apt-get clean --yes \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /tmp/* \ && rm -rf /var/tmp/* \ && rm -rf /var/cache/apt/archives/* \ && truncate -s 0 /var/log/*log # setup docker-specific things COPY docker/ ./docker/ WORKDIR /usr/src/paperless/src/docker/ RUN set -eux \ && cp imagemagick-policy.xml /etc/ImageMagick-6/policy.xml \ && mkdir /var/log/supervisord /var/run/supervisord \ && cp supervisord.conf /etc/supervisord.conf \ && cp docker-entrypoint.sh /sbin/docker-entrypoint.sh \ && chmod 755 /sbin/docker-entrypoint.sh \ && cp docker-prepare.sh /sbin/docker-prepare.sh \ && chmod 755 /sbin/docker-prepare.sh \ && cp wait-for-redis.py /sbin/wait-for-redis.py \ && chmod 755 /sbin/wait-for-redis.py \ && chmod +x install_management_commands.sh \ && ./install_management_commands.sh WORKDIR /usr/src/paperless/ COPY gunicorn.conf.py . WORKDIR /usr/src/paperless/src/ # copy app COPY --from=compile-frontend /src/src/ ./ # add users, setup scripts RUN set -eux \ && addgroup --gid 1000 paperless \ && useradd --uid 1000 --gid paperless --home-dir /usr/src/paperless paperless \ && chown -R paperless:paperless ../ \ && gosu paperless python3 manage.py collectstatic --clear --no-input \ && gosu paperless python3 manage.py compilemessages VOLUME ["/usr/src/paperless/data", \ "/usr/src/paperless/media", \ "/usr/src/paperless/consume", \ "/usr/src/paperless/export"] ENTRYPOINT ["/sbin/docker-entrypoint.sh"] EXPOSE 8000 CMD ["/usr/local/bin/supervisord", "-c", "/etc/supervisord.conf"]