Nei*_*ard 19 docker dockerfile alpine-linux
我需要使用标准的 Alpine docker 镜像并安装特定版本的 Node 和 NPM。到目前为止,这是我的尝试:
\nFROM alpine:3.17.2\n\nRUN apk update\nRUN apk upgrade\nRUN apk add bash git helm openssh yq github-cli\n\nRUN apk add \\\n curl \\\n docker \\\n openrc\n\n# nvm environment variables\nENV NVM_DIR /usr/local/nvm\nENV NVM_VERSION 0.39.3\nENV NODE_VERSION 18.16.0\n\n# install nvm\n# https://github.com/creationix/nvm#install-script\nRUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v$NVM_VERSION/install.sh | bash\n\n# install node and npm\nRUN source $NVM_DIR/nvm.sh \\\n && nvm install $NODE_VERSION \\\n && nvm alias default $NODE_VERSION \\\n && nvm use default\n\n# add node and npm to path so the commands are available\nENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules\nENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH\n\nRUN ls -asl $NVM_DIR/versions/node/v$NODE_VERSION/bin\nRUN ls -asl $NVM_DIR/versions/node/v$NODE_VERSION/lib/node_modules/npm/bin\n\nRUN $NVM_DIR/versions/node/v$NODE_VERSION/bin/node -v\n\nRUN $NVM_DIR/versions/node/v$NODE_VERSION/bin/npm install --global yarn\n\n# Start docker on boot\nRUN rc-update add docker boot\n\n# Default commands to bash\nENTRYPOINT ["bash"]Run Code Online (Sandbox Code Playgroud)\n我得到这个:
\n#7 [ 4/10] RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.3/install.sh | bash\n#7 sha256:76a5a08c3c01075cd22585bc1f3df8f47fe258b116742db843cea6fa553a09c6\n#7 0.181 % Total % Received % Xferd Average Speed Time Time Time Current\n#7 0.182 Dload Upload Total Spent Left Speed\n100 15916 100 15916 0 0 57463 0 --:--:-- --:--:-- --:--:-- 60287\n#7 0.478 => Downloading nvm from git to \'/usr/local/nvm\'\n=> Cloning into \'/usr/local/nvm\'...\n#7 3.239 * (HEAD detached at FETCH_HEAD)\n#7 3.240 master\n#7 3.268 => Compressing and cleaning up git repository\n#7 3.307\n#7 3.338 => Profile not found. Tried ~/.bashrc, ~/.bash_profile, ~/.zprofile, ~/.zshrc, and ~/.profile.\n#7 3.338 => Create one of them and run this script again\n#7 3.338 OR\n#7 3.338 => Append the following lines to the correct file yourself:\n#7 3.338\n#7 3.338 export NVM_DIR="/usr/local/nvm"\n#7 3.338 [ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh" # This loads nvm\n#7 3.338\n#7 3.440 => Installing Node.js version 18.16.0\n#7 4.948 Downloading and installing node v18.16.0...\n#7 5.646 Downloading https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-x64.tar.gz...\n######################################################################## 100.0%\n#7 8.333 Computing checksum with sha256sum\n#7 8.832 Checksums matched!\n#7 11.93 Now using node v18.16.0 (npm v)\n#7 12.41 Creating default alias: default -> 18.16.0 (-> v18.16.0 *)\n#7 12.63 Failed to install Node.js 18.16.0\n#7 12.63 => Close and reopen your terminal to start using nvm or run the following to use it now:\n#7 12.63\n#7 12.63 export NVM_DIR="/usr/local/nvm"\n#7 12.63 [ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh" # This loads nvm\n#7 DONE 12.7sRun Code Online (Sandbox Code Playgroud)\n我不确定“无法安装 Node.js 18.16.0”消息,正如您在我的测试中使用“ls”看到的那样,它似乎已安装?
\n首先,我“ls”我希望安装节点的 bin 目录:
\nRUN ls -asl /usr/local/nvm/versions/node/v18.16.0/bin\n#9 sha256:42ba843ab812861bf82e0e493e211095cc749408940b5ec21ce94fabe3997538\n#9 0.138 total 88820\n#9 0.141 4 drwxr-xr-x 2 1000 1000 4096 Apr 27 07:35 .\n#9 0.141 4 drwxr-xr-x 6 root root 4096 Apr 27 07:35 ..\n#9 0.141 0 lrwxrwxrwx 1 root root 45 Apr 27 07:35 corepack -> ../lib/node_modules/corepack/dist/corepack.js\n#9 0.141 88812 -rwxr-xr-x 1 1000 1000 90940576 Apr 12 05:31 node\n#9 0.141 0 lrwxrwxrwx 1 root root 38 Apr 27 07:35 npm -> ../lib/node_modules/npm/bin/npm-cli.js\n#9 0.141 0 lrwxrwxrwx 1 root root 38 Apr 27 07:35 npx -> ../lib/node_modules/npm/bin/npx-cli.js\n#9 DONE 0.1sRun Code Online (Sandbox Code Playgroud)\n这对我来说似乎没问题,不是吗?
\n我的另一个“ls”给出了这个:
\nRUN ls -asl /usr/local/nvm/versions/node/v18.16.0/lib/node_modules/npm/bin\n#10 sha256:c2872332dbb58f191400fa23211a691db9a5f5dc07425bc9d3c83bf1cafb31f8\n#10 0.141 total 36\n#10 0.144 4 drwxr-xr-x 3 1000 1000 4096 Apr 27 07:35 .\n#10 0.144 4 drwxr-xr-x 7 1000 1000 4096 Apr 27 07:35 ..\n#10 0.144 4 drwxr-xr-x 2 1000 1000 4096 Apr 27 07:35 node-gyp-bin\n#10 0.144 4 -rwxr-xr-x 1 1000 1000 1365 Oct 11 2022 npm\n#10 0.144 4 -rwxr-xr-x 1 1000 1000 54 Oct 11 2022 npm-cli.js\n#10 0.144 4 -rwxr-xr-x 1 1000 1000 483 Oct 11 2022 npm.cmd\n#10 0.144 4 -rwxr-xr-x 1 1000 1000 1567 Oct 11 2022 npx\n#10 0.144 4 -rwxr-xr-x 1 1000 1000 2922 Dec 7 06:00 npx-cli.js\n#10 0.144 4 -rwxr-xr-x 1 1000 1000 539 Oct 11 2022 npx.cmd\n#10 DONE 0.2sRun Code Online (Sandbox Code Playgroud)\n那么 npm 也在这里,看起来不错吗?
\n在我最初的帖子中,我给出了错误的错误消息,我很抱歉。该错误消息来自我的本地计算机,这是一台配备 M2 CPU 的 Mac,我相信这是导致该错误的原因,但那是另一天的事了。我需要它在构建服务器上运行,我们在 amd64 上运行 linux,所以我有一个不同的错误,以下错误:
\nStep 14/17 : RUN $NVM_DIR/versions/node/v$NODE_VERSION/bin/node -v\n ---> Running in d63ec3b287d9\n/bin/sh: /usr/local/nvm/versions/node/v18.16.0/bin/node: not found\nThe command \'/bin/sh -c $NVM_DIR/versions/node/v$NODE_VERSION/bin/node -v\' returned a non-zero code: 127\n\nError: Process completed with exit code 127.Run Code Online (Sandbox Code Playgroud)\n所以我的“ls”说节点在那里,但当我尝试运行它时,它不在那里?
\n最好的问候
\nS\xc3\xb8ren
Ali*_*vhr 21
我不知道你为什么使用NVM.
按照你的话。怎么做并不重要,但你必须在特定版本的 alpine 上安装特定版本的节点!
只需更改NODE_VERSION为ALPINE_VERSION您需要的即可。
这是我使用alpine图像而不是节点的方法:
ARG NODE_VERSION=18.16.0
ARG ALPINE_VERSION=3.17.2
FROM node:${NODE_VERSION}-alpine AS node
FROM alpine:${ALPINE_VERSION}
COPY --from=node /usr/lib /usr/lib
COPY --from=node /usr/local/lib /usr/local/lib
COPY --from=node /usr/local/include /usr/local/include
COPY --from=node /usr/local/bin /usr/local/bin
RUN node -v
RUN npm install -g yarn --force
RUN yarn -v
CMD ["node", "path/to/your/script.js"]
Run Code Online (Sandbox Code Playgroud)
我删除了不必要的软件包安装,但如果需要,您可以添加它们!
例如:RUN apk add bash git helm openssh yq github-cli
例如:RUN rc-update add docker boot
添加NODE_VERSIONasARG这样您就可以在任何地方使用它!
将二进制文件从官方版本复制node:<version>-alpine到您的 alpine 版本!
yarn只需使用标志安装--force即可避免错误并完成!!!!
CMDpath/to/your/script.js足以运行你的长跑JS。不要使用额外的工具!
您可以从这里node使用它自己提供的代码。只需更改前两行的版本即可!
FROM alpine:3.17.2
ENV NODE_VERSION 18.16.0
RUN addgroup -g 1000 node \
&& adduser -u 1000 -G node -s /bin/sh -D node \
&& apk add --no-cache \
libstdc++ \
&& apk add --no-cache --virtual .build-deps \
curl \
&& ARCH= && alpineArch="$(apk --print-arch)" \
&& case "${alpineArch##*-}" in \
x86_64) \
ARCH='x64' \
CHECKSUM="f3ad9443e8d9d53bfc00ec875181e9dc2ccf86205a50fce119e0610cdba8ccf1" \
;; \
*) ;; \
esac \
&& if [ -n "${CHECKSUM}" ]; then \
set -eu; \
curl -fsSLO --compressed "https://unofficial-builds.nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz"; \
echo "$CHECKSUM node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" | sha256sum -c - \
&& tar -xJf "node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs; \
else \
echo "Building from source" \
# backup build
&& apk add --no-cache --virtual .build-deps-full \
binutils-gold \
g++ \
gcc \
gnupg \
libgcc \
linux-headers \
make \
python3 \
# use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150
&& export GNUPGHOME="$(mktemp -d)" \
# gpg keys listed at https://github.com/nodejs/node#release-keys
&& for key in \
4ED778F539E3634C779C87C6D7062848A1AB005C \
141F07595B7B3FFE74309A937405533BE57C7D57 \
74F12602B6F1C4E913FAA37AD3A89613643B6201 \
DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 \
61FC681DFB92A079F1685E77973F295594EC4689 \
8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 \
C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C \
108F52B48DB57BB0CC439B2997B01419BD92F80A \
; do \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" || \
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \
done \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION.tar.xz" \
&& curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& grep " node-v$NODE_VERSION.tar.xz\$" SHASUMS256.txt | sha256sum -c - \
&& tar -xf "node-v$NODE_VERSION.tar.xz" \
&& cd "node-v$NODE_VERSION" \
&& ./configure \
&& make -j$(getconf _NPROCESSORS_ONLN) V= \
&& make install \
&& apk del .build-deps-full \
&& cd .. \
&& rm -Rf "node-v$NODE_VERSION" \
&& rm "node-v$NODE_VERSION.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt; \
fi \
&& rm -f "node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" \
&& apk del .build-deps \
# Run some smoke tests
&& node --version \
&& npm --version
ENV YARN_VERSION 1.22.19
RUN apk add --no-cache --virtual .build-deps-yarn curl gnupg tar \
# use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150
&& export GNUPGHOME="$(mktemp -d)" \
&& for key in \
6A010C5166006599AA17F08146C2130DFD2497F5 \
; do \
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" || \
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \
done \
&& curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \
&& curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \
&& gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& mkdir -p /opt \
&& tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \
&& ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \
&& ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \
&& rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \
&& apk del .build-deps-yarn \
# smoke test
&& yarn --version
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]
CMD [ "node" ]
Run Code Online (Sandbox Code Playgroud)
这是我的解决方案,它使用来自https://nodejs.org/en/download的非官方节点构建
FROM alpine:3.17.2
ENV NODE_PACKAGE_URL https://unofficial-builds.nodejs.org/download/release/v18.16.0/node-v18.16.0-linux-x64-musl.tar.gz
RUN apk add libstdc++
WORKDIR /opt
RUN wget $NODE_PACKAGE_URL
RUN mkdir -p /opt/nodejs
RUN tar -zxvf *.tar.gz --directory /opt/nodejs --strip-components=1
RUN rm *.tar.gz
RUN ln -s /opt/nodejs/bin/node /usr/local/bin/node
RUN ln -s /opt/nodejs/bin/npm /usr/local/bin/npm
# npm version coming with node is 9.5.1
# To install specific npm version, run the following command, or remove it to use the default npm version:
RUN npm install -g npm@9.6.6
Run Code Online (Sandbox Code Playgroud)
docker build -t node-18.16.0-npm-9.6.6-alpine-3.17.2 .
[+] Building 24.4s (15/15) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 753B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:3.17.2 0.7s
=> [ 1/11] FROM docker.io/library/alpine:3.17.2@sha256:ff6bdca1701f3a8a67e328815ff2346b0e4067d32ec36b7992c1fdc001dc8517 0.0s
=> CACHED [ 2/11] RUN apk add libstdc++ 0.0s
=> CACHED [ 3/11] WORKDIR /opt 0.0s
=> CACHED [ 4/11] RUN wget https://unofficial-builds.nodejs.org/download/release/v18.16.0/node-v18.16.0-linux-x64-musl.tar.gz 0.0s
=> CACHED [ 5/11] RUN mkdir -p /opt/nodejs 0.0s
=> [ 6/11] RUN tar -zxvf *.tar.gz --directory /opt/nodejs --strip-components=1 4.2s
=> [ 7/11] RUN rm *.tar.gz 0.3s
=> [ 8/11] RUN ls -l /opt/nodejs 0.6s
=> [ 9/11] RUN ln -s /opt/nodejs/bin/node /usr/local/bin/node 0.2s
=> [10/11] RUN ln -s /opt/nodejs/bin/npm /usr/local/bin/npm 0.2s
=> [11/11] RUN npm install -g npm@9.6.6 17.1s
=> exporting to image 1.0s
=> => exporting layers 0.9s
=> => writing image sha256:e133d992089c2efd071b423fa093f81bf4a732ac06c1ec7dd6cb09cec894a9b3 0.0s
=> => naming to docker.io/library/node-18.16.0-npm-9.6.6-alpine-3.17.2
Run Code Online (Sandbox Code Playgroud)
docker run -it node-18.16.0-npm-9.6.6-alpine-3.17.2 node --version
v18.16.0
Run Code Online (Sandbox Code Playgroud)
docker run -it node-18.16.0-npm-9.6.6-alpine-3.17.2 npm --version
9.6.6
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34610 次 |
| 最近记录: |