From 61cadd0e6a645c6ec7e71aa4769320d6e408e7dd Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Mon, 30 Mar 2026 22:24:32 +0200 Subject: [PATCH] chore(Dockerfile): better distinction between intructions in a single RUN --- build/Dockerfile | 144 ++++++++++++++++++++++------------------------- 1 file changed, 68 insertions(+), 76 deletions(-) diff --git a/build/Dockerfile b/build/Dockerfile index 66710c52..cbcbfea6 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -17,16 +17,16 @@ ENV CGO_ENABLED=0 # Define the working directory outside of $GOPATH (we're using go modules). WORKDIR /home -RUN curl -Ls "https://github.com/pdfcpu/pdfcpu/archive/refs/tags/$PDFCPU_VERSION.tar.gz" -o pdfcpu.tar.gz &&\ - tar --strip-components=1 -xvzf pdfcpu.tar.gz +RUN curl -Ls "https://github.com/pdfcpu/pdfcpu/archive/refs/tags/$PDFCPU_VERSION.tar.gz" -o pdfcpu.tar.gz \ + && tar --strip-components=1 -xvzf pdfcpu.tar.gz # Install module dependencies. -RUN go mod download &&\ - go mod verify +RUN go mod download \ + && go mod verify -RUN go build -o pdfcpu -ldflags "-s -w -X 'main.version=$PDFCPU_VERSION' -X 'github.com/pdfcpu/pdfcpu/pkg/pdfcpu.VersionStr=$PDFCPU_VERSION' -X main.builtBy=gotenberg" ./cmd/pdfcpu &&\ +RUN go build -o pdfcpu -ldflags "-s -w -X 'main.version=$PDFCPU_VERSION' -X 'github.com/pdfcpu/pdfcpu/pkg/pdfcpu.VersionStr=$PDFCPU_VERSION' -X main.builtBy=gotenberg" ./cmd/pdfcpu \ # Verify installation. - ./pdfcpu version + && ./pdfcpu version # ---------------------------------------------- # Gotenberg binary build stage @@ -42,16 +42,16 @@ WORKDIR /home # Install module dependencies. COPY go.mod go.sum ./ -RUN go mod download &&\ - go mod verify +RUN go mod download \ + && go mod verify # Copy the source code. COPY cmd ./cmd COPY pkg ./pkg -RUN go build -o gotenberg -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg/main.go &&\ - go build -o gotenberg-chromium -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg-chromium/main.go &&\ - go build -o gotenberg-libreoffice -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg-libreoffice/main.go +RUN go build -o gotenberg -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg/main.go \ + && go build -o gotenberg-chromium -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg-chromium/main.go \ + && go build -o gotenberg-libreoffice -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/cmd.Version=$GOTENBERG_VERSION'" cmd/gotenberg-libreoffice/main.go # ---------------------------------------------- # Custom JRE stage @@ -59,10 +59,9 @@ RUN go build -o gotenberg -ldflags "-s -w -X 'github.com/gotenberg/gotenberg/v8/ # ---------------------------------------------- FROM debian:13-slim AS custom-jre-stage -RUN \ - apt-get update -qq &&\ - apt-get upgrade -yqq &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends default-jdk-headless binutils +RUN apt-get update -qq \ + && apt-get upgrade -yqq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends default-jdk-headless binutils # Note: jdeps helps finding which modules a JAR requires. # Currently only for PDFtk, as we don't rely on LibreOffice UNO Java SDK. @@ -84,16 +83,16 @@ FROM debian:13-slim AS downloader-stage # See https://gitlab.com/pdftk-java/pdftk/-/releases - Binary package. ARG PDFTK_VERSION=v3.3.3 -RUN apt-get update -qq &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends curl ca-certificates +RUN apt-get update -qq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends curl ca-certificates WORKDIR /downloads -RUN curl -Ls https://raw.githubusercontent.com/gotenberg/unoconverter/v0.2.0/unoconv -o unoconverter &&\ - chmod +x unoconverter +RUN curl -Ls https://raw.githubusercontent.com/gotenberg/unoconverter/v0.2.0/unoconv -o unoconverter \ + && chmod +x unoconverter -RUN curl -o pdftk-all.jar "https://gitlab.com/api/v4/projects/5024297/packages/generic/pdftk-java/$PDFTK_VERSION/pdftk-all.jar" &&\ - chmod a+x pdftk-all.jar +RUN curl -o pdftk-all.jar "https://gitlab.com/api/v4/projects/5024297/packages/generic/pdftk-java/$PDFTK_VERSION/pdftk-all.jar" \ + && chmod a+x pdftk-all.jar # ---------------------------------------------- # Base image stage @@ -115,19 +114,17 @@ FROM base-image-stage AS common-stage ARG GOTENBERG_USER_GID=1001 ARG GOTENBERG_USER_UID=1001 -RUN \ - # Create a non-root user. - # All processes in the Docker container will run with this dedicated user. - groupadd --gid "$GOTENBERG_USER_GID" gotenberg &&\ - useradd --uid "$GOTENBERG_USER_UID" --gid gotenberg --shell /bin/bash --home /home/gotenberg --no-create-home gotenberg &&\ - mkdir /home/gotenberg &&\ - chown gotenberg: /home/gotenberg +# Create a non-root user. +# All processes in the Docker container will run with this dedicated user. +RUN groupadd --gid "$GOTENBERG_USER_GID" gotenberg \ + && useradd --uid "$GOTENBERG_USER_UID" --gid gotenberg --shell /bin/bash --home /home/gotenberg --no-create-home gotenberg \ + && mkdir /home/gotenberg \ + && chown gotenberg: /home/gotenberg -RUN \ - apt-get update -qq &&\ - apt-get upgrade -yqq &&\ - # Note: tini is a helper for reaping zombie processes. - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \ +# Note: tini is a helper for reaping zombie processes. +RUN apt-get update -qq \ + && apt-get upgrade -yqq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \ tini \ # Install fonts. # Essential metric-compatible fonts for LibreOffice layout fidelity (replaces MS Fonts). @@ -144,27 +141,26 @@ RUN \ # Tofu prevention. fonts-noto-core \ # Install QPDF & ExifTool (PDF engines). - qpdf exiftool &&\ + qpdf exiftool \ # See https://github.com/nextcloud/docker/issues/380. - mkdir -p /usr/share/man/man1 &&\ + && mkdir -p /usr/share/man/man1 \ # Cleanup. - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Copy PDFtk jar and create bash wrapper. # See https://github.com/gotenberg/gotenberg/pull/273. COPY --link --from=downloader-stage /downloads/pdftk-all.jar /usr/bin/pdftk-all.jar -RUN printf '#!/bin/bash\n\nexec java -jar /usr/bin/pdftk-all.jar "$@"' > /usr/bin/pdftk &&\ - chmod +x /usr/bin/pdftk +RUN printf '#!/bin/bash\n\nexec java -jar /usr/bin/pdftk-all.jar "$@"' > /usr/bin/pdftk \ + && chmod +x /usr/bin/pdftk # Support for arbitrary user IDs (OpenShift). # See: # https://github.com/gotenberg/gotenberg/issues/1049. # https://docs.redhat.com/en/documentation/openshift_container_platform/4.15/html/images/creating-images#use-uid_create-images. -RUN \ - usermod -aG root gotenberg &&\ - chgrp -R 0 /home/gotenberg &&\ - chmod -R g=u /home/gotenberg +RUN usermod -aG root gotenberg \ + && chgrp -R 0 /home/gotenberg \ + && chmod -R g=u /home/gotenberg # Improve fonts subpixel hinting and smoothing. # Credits: @@ -212,20 +208,18 @@ LABEL org.opencontainers.image.title="Gotenberg" \ org.opencontainers.image.documentation="https://gotenberg.dev" \ org.opencontainers.image.source="https://github.com/gotenberg/gotenberg" -RUN \ - # Install Chromium. - apt-get update -qq &&\ - apt-get upgrade -yqq &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends chromium &&\ +# Install Chromium. +RUN apt-get update -qq \ + && apt-get upgrade -yqq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends chromium \ # Cleanup. - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -RUN \ - # Install LibreOffice & unoconverter. - echo "deb http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list &&\ - apt-get update -qq &&\ - apt-get upgrade -yqq &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \ +# Install LibreOffice & unoconverter. +RUN echo "deb http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list \ + && apt-get update -qq \ + && apt-get upgrade -yqq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \ python3 python3-distutils-extra \ # Install Hyphenation for LibreOffice. # Credits: https://wiki.archlinux.org/title/LibreOffice. @@ -233,13 +227,13 @@ RUN \ hyphen-en-gb hyphen-en-us hyphen-eo hyphen-es hyphen-fr hyphen-gl hyphen-gu hyphen-hi hyphen-hr hyphen-hu \ hyphen-id hyphen-is hyphen-it hyphen-kn hyphen-lt hyphen-lv hyphen-ml hyphen-mn hyphen-mr hyphen-nl \ hyphen-no hyphen-or hyphen-pa hyphen-pl hyphen-pt-br hyphen-pt-pt hyphen-ro hyphen-ru hyphen-sk hyphen-sl \ - hyphen-sr hyphen-sv hyphen-ta hyphen-te hyphen-th hyphen-uk hyphen-zu &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t trixie-backports \ - libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-draw python3-uno &&\ + hyphen-sr hyphen-sv hyphen-ta hyphen-te hyphen-th hyphen-uk hyphen-zu \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t trixie-backports \ + libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-draw python3-uno \ # unoconverter will look for the Python binary, which has to be at version 3. - ln -s /usr/bin/python3 /usr/bin/python &&\ + && ln -s /usr/bin/python3 /usr/bin/python \ # Cleanup. - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Copy unoconverter. COPY --link --from=downloader-stage /downloads/unoconverter /usr/bin/unoconverter @@ -281,13 +275,12 @@ LABEL org.opencontainers.image.title="Gotenberg (Chromium)" \ org.opencontainers.image.documentation="https://gotenberg.dev" \ org.opencontainers.image.source="https://github.com/gotenberg/gotenberg" -RUN \ - # Install Chromium. - apt-get update -qq &&\ - apt-get upgrade -yqq &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends chromium &&\ +# Install Chromium. +RUN apt-get update -qq \ + && apt-get upgrade -yqq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends chromium \ # Cleanup. - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Copy dictionnaries so that hyphens work on Chromium. # See https://github.com/gotenberg/gotenberg/issues/1293. @@ -322,12 +315,11 @@ LABEL org.opencontainers.image.title="Gotenberg (LibreOffice)" \ org.opencontainers.image.documentation="https://gotenberg.dev" \ org.opencontainers.image.source="https://github.com/gotenberg/gotenberg" -RUN \ - # Install LibreOffice & unoconverter. - echo "deb http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list &&\ - apt-get update -qq &&\ - apt-get upgrade -yqq &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \ +# Install LibreOffice & unoconverter. +RUN echo "deb http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list \ + && apt-get update -qq \ + && apt-get upgrade -yqq \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends \ python3 python3-distutils-extra \ # Install Hyphenation for LibreOffice. # Credits: https://wiki.archlinux.org/title/LibreOffice. @@ -335,13 +327,13 @@ RUN \ hyphen-en-gb hyphen-en-us hyphen-eo hyphen-es hyphen-fr hyphen-gl hyphen-gu hyphen-hi hyphen-hr hyphen-hu \ hyphen-id hyphen-is hyphen-it hyphen-kn hyphen-lt hyphen-lv hyphen-ml hyphen-mn hyphen-mr hyphen-nl \ hyphen-no hyphen-or hyphen-pa hyphen-pl hyphen-pt-br hyphen-pt-pt hyphen-ro hyphen-ru hyphen-sk hyphen-sl \ - hyphen-sr hyphen-sv hyphen-ta hyphen-te hyphen-th hyphen-uk hyphen-zu &&\ - DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t trixie-backports \ - libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-draw python3-uno &&\ + hyphen-sr hyphen-sv hyphen-ta hyphen-te hyphen-th hyphen-uk hyphen-zu \ + && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq --no-install-recommends -t trixie-backports \ + libreoffice-writer libreoffice-calc libreoffice-impress libreoffice-draw python3-uno \ # unoconverter will look for the Python binary, which has to be at version 3. - ln -s /usr/bin/python3 /usr/bin/python &&\ + && ln -s /usr/bin/python3 /usr/bin/python \ # Cleanup. - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Copy unoconverter. COPY --link --from=downloader-stage /downloads/unoconverter /usr/bin/unoconverter