| 
 | 1 | +FROM debian:trixie-slim  | 
 | 2 | + | 
 | 3 | +RUN groupadd --gid 1000 node \  | 
 | 4 | +  && useradd --uid 1000 --gid node --shell /bin/bash --create-home node  | 
 | 5 | + | 
 | 6 | +ENV NODE_VERSION 20.19.3  | 
 | 7 | + | 
 | 8 | +RUN ARCH= OPENSSL_ARCH= && dpkgArch="$(dpkg --print-architecture)" \  | 
 | 9 | +    && case "${dpkgArch##*-}" in \  | 
 | 10 | +      amd64) ARCH='x64' OPENSSL_ARCH='linux-x86_64';; \  | 
 | 11 | +      ppc64el) ARCH='ppc64le' OPENSSL_ARCH='linux-ppc64le';; \  | 
 | 12 | +      s390x) ARCH='s390x' OPENSSL_ARCH='linux-s390x';; \  | 
 | 13 | +      arm64) ARCH='arm64' OPENSSL_ARCH='linux-aarch64';; \  | 
 | 14 | +      armhf) ARCH='armv7l' OPENSSL_ARCH='linux-armv4';; \  | 
 | 15 | +      i386) ARCH='x86' OPENSSL_ARCH='linux-elf';; \  | 
 | 16 | +      *) echo "unsupported architecture"; exit 1 ;; \  | 
 | 17 | +    esac \  | 
 | 18 | +    && set -ex \  | 
 | 19 | +    # libatomic1 for arm  | 
 | 20 | +    && apt-get update && apt-get install -y ca-certificates curl wget gnupg dirmngr xz-utils libatomic1 --no-install-recommends \  | 
 | 21 | +    && rm -rf /var/lib/apt/lists/* \  | 
 | 22 | +    # use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150  | 
 | 23 | +    && export GNUPGHOME="$(mktemp -d)" \  | 
 | 24 | +    # gpg keys listed at https://github.com/nodejs/node#release-keys  | 
 | 25 | +    && for key in \  | 
 | 26 | +      C0D6248439F1D5604AAFFB4021D900FFDB233756 \  | 
 | 27 | +      DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 \  | 
 | 28 | +      CC68F5A3106FF448322E48ED27F5E38D5B0A215F \  | 
 | 29 | +      8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \  | 
 | 30 | +      890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 \  | 
 | 31 | +      C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C \  | 
 | 32 | +      108F52B48DB57BB0CC439B2997B01419BD92F80A \  | 
 | 33 | +      A363A499291CBBC940DD62E41F10027AF002F8B0 \  | 
 | 34 | +    ; do \  | 
 | 35 | +      { gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" && gpg --batch --fingerprint "$key"; } || \  | 
 | 36 | +      { gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" && gpg --batch --fingerprint "$key"; } ; \  | 
 | 37 | +    done \  | 
 | 38 | +    && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \  | 
 | 39 | +    && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \  | 
 | 40 | +    && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \  | 
 | 41 | +    && gpgconf --kill all \  | 
 | 42 | +    && rm -rf "$GNUPGHOME" \  | 
 | 43 | +    && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \  | 
 | 44 | +    && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \  | 
 | 45 | +    && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \  | 
 | 46 | +    # Remove unused OpenSSL headers to save ~34MB. See this NodeJS issue: https://github.com/nodejs/node/issues/46451  | 
 | 47 | +    && find /usr/local/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name "$OPENSSL_ARCH" -exec rm -rf {} \; \  | 
 | 48 | +    && apt-mark auto '.*' > /dev/null \  | 
 | 49 | +    && find /usr/local -type f -executable -exec ldd '{}' ';' \  | 
 | 50 | +      | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); print so }' \  | 
 | 51 | +      | sort -u \  | 
 | 52 | +      | xargs -r dpkg-query --search \  | 
 | 53 | +      | cut -d: -f1 \  | 
 | 54 | +      | sort -u \  | 
 | 55 | +      | xargs -r apt-mark manual \  | 
 | 56 | +    && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \  | 
 | 57 | +    && ln -s /usr/local/bin/node /usr/local/bin/nodejs \  | 
 | 58 | +    # smoke tests  | 
 | 59 | +    && node --version \  | 
 | 60 | +    && npm --version \  | 
 | 61 | +    && rm -rf /tmp/*  | 
 | 62 | + | 
 | 63 | +ENV YARN_VERSION 1.22.22  | 
 | 64 | + | 
 | 65 | +RUN set -ex \  | 
 | 66 | +  && savedAptMark="$(apt-mark showmanual)" \  | 
 | 67 | +  && apt-get update && apt-get install -y ca-certificates curl wget gnupg dirmngr --no-install-recommends \  | 
 | 68 | +  && rm -rf /var/lib/apt/lists/* \  | 
 | 69 | +  # use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150  | 
 | 70 | +  && export GNUPGHOME="$(mktemp -d)" \  | 
 | 71 | +  && for key in \  | 
 | 72 | +    6A010C5166006599AA17F08146C2130DFD2497F5 \  | 
 | 73 | +  ; do \  | 
 | 74 | +    { gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" && gpg --batch --fingerprint "$key"; } || \  | 
 | 75 | +    { gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" && gpg --batch --fingerprint "$key"; } ; \  | 
 | 76 | +  done \  | 
 | 77 | +  && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \  | 
 | 78 | +  && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \  | 
 | 79 | +  && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \  | 
 | 80 | +  && gpgconf --kill all \  | 
 | 81 | +  && rm -rf "$GNUPGHOME" \  | 
 | 82 | +  && mkdir -p /opt \  | 
 | 83 | +  && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \  | 
 | 84 | +  && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \  | 
 | 85 | +  && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \  | 
 | 86 | +  && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \  | 
 | 87 | +  && apt-mark auto '.*' > /dev/null \  | 
 | 88 | +  && { [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; } \  | 
 | 89 | +  && find /usr/local -type f -executable -exec ldd '{}' ';' \  | 
 | 90 | +    | awk '/=>/ { so = $(NF-1); if (index(so, "/usr/local/") == 1) { next }; gsub("^/(usr/)?", "", so); print so }' \  | 
 | 91 | +    | sort -u \  | 
 | 92 | +    | xargs -r dpkg-query --search \  | 
 | 93 | +    | cut -d: -f1 \  | 
 | 94 | +    | sort -u \  | 
 | 95 | +    | xargs -r apt-mark manual \  | 
 | 96 | +  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \  | 
 | 97 | +  # smoke test  | 
 | 98 | +  && yarn --version \  | 
 | 99 | +  && rm -rf /tmp/*  | 
 | 100 | + | 
 | 101 | +COPY docker-entrypoint.sh /usr/local/bin/  | 
 | 102 | +ENTRYPOINT ["docker-entrypoint.sh"]  | 
 | 103 | + | 
 | 104 | +CMD [ "node" ]  | 
0 commit comments