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过程中调用已安装的二进制文件的正确方法是什么?
笔记:
- 我也尝试将二进制文件链接到
/bin
,但是sh
仍然无法在RUN
find它们。 - 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,这将是一个更好的起点。