Dockerfile – RUN无法执行环境PATH中可用的二进制文件

创build一个dockerfile来安装依赖二进制文件:

 FROM alpine RUN apk update \ && apk add ca-certificates wget \ && update-ca-certificates RUN mkdir -p /opt/nodejs \ && cd /opt/nodejs \ && wget -qO- https://nodejs.org/dist/v8.9.1/node-v8.9.1-linux-x64.tar.gz | tar xvz --strip-components=1 RUN chmod +x /opt/nodejs/bin/* ENV PATH="/opt/nodejs/bin:${PATH}" RUN which node RUN node --version 

which node正确识别$PATH的节点二进制文件,因为之前的ENV命令修改了$PATH 。 但是, RUN node --version无法find二进制文件。

图像生成日志显示:

 Step 11 : ENV PATH "/opt/nodejs/bin:${PATH}" ---> Using cache ---> 7dc04c05007f Step 12 : RUN which node ---> Running in deeaf8e9fe09 /opt/nodejs/bin/node ---> 074820b1b9b5 Step 13 : RUN node --version ---> Running in 6f7eabd95e90 /bin/sh: node: not found The command '/bin/sh -c node --version' returned a non-zero code: 127 

在图像构build过程中调用已安装的二进制文件的正确方法是什么?

笔记:

  1. 我也尝试将二进制文件链接到/bin ,但是sh仍然无法在RUNfind它们。
  2. Docker版本1.12.1

您安装的节点版本对不包含在高山基本映像中的库有依赖关系。 这也可能与glibc而不是musl相关联。

 / # apk add file (1/2) Installing libmagic (5.28-r0) (2/2) Installing file (5.28-r0) Executing busybox-1.25.1-r0.trigger OK: 9 MiB in 15 packages / # file /opt/nodejs/bin/node /opt/nodejs/bin/node: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=862ecb804ed99547c06d5bd4ac1090da500acb61, not stripped / # ldd /opt/nodejs/bin/node /lib64/ld-linux-x86-64.so.2 (0x7f793665d000) libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f793665d000) librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f793665d000) Error loading shared library libstdc++.so.6: No such file or directory (needed by /opt/nodejs/bin/node) libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f793665d000) Error loading shared library libgcc_s.so.1: No such file or directory (needed by /opt/nodejs/bin/node) libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f793665d000) libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f793665d000) 

你可以从docker hub的官方仓库find一个在Alpine上安装节点的Dockerfile,这将是一个更好的起点。