Docker在容器内的PATH中看不到二进制文件

时间:2018-07-13 08:41:11

标签: bash shell docker alpine

我正在尝试构建一个Docker映像,以帮助自动从Google Protocol Buffers规范文件中生成代码。

我当前的Dockerfile:

FROM alpine:latest

WORKDIR /protobuf
VOLUME /dst

RUN apk update \
 && apk add --no-cache bash \
 && apk add --virtual .build-deps curl unzip \
 && curl -k -L https://github.com/google/protobuf/releases/download/v3.6.0/protoc-3.6.0-linux-x86_64.zip -o protoc.zip \
 && unzip protoc.zip \
 && rm protoc.zip \
 && chmod +x ./bin/protoc \
 && apk --purge del .build-deps

COPY . spec/
RUN chmod +x spec/entrypoint.sh

ENV SRC_DIR=/usr/src/protoc/spec DST_DIR=/dst PATH=/protobuf/bin:${PATH}
ENTRYPOINT [ "/bin/bash" ]

在启用TTY的情况下构建和运行它时,它运行没有问题。但是,容器内的Shell某种程度上无法看到/protobuf/bin/protoc二进制文件,即使它应该能够:

bash-4.4# echo $PATH
/protobuf/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
bash-4.4# ls -l /protobuf/bin
total 4444
-rwxr-xr-x    1 root     root       4548312 Jun 15 23:40 protoc
bash-4.4# protoc
bash: /protobuf/bin/protoc: No such file or directory

这里可能是什么问题?

1 个答案:

答案 0 :(得分:2)

protobuf与glibc库链接,并且高山使用musl(而较旧的高山使用uclibc)。它们不兼容。您看到的错误来自链接器未找到libc标准库/lib64/ld-linux-x86-64.so.2。您可以通过发出ldd命令来进行检查:

$ ldd /bin/protoc 
    /lib64/ld-linux-x86-64.so.2 (0x7faa1a641000)
    libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7faa1a641000)
    libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7faa1a641000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7faa1a641000)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /bin/protoc)

该文件存在,并且PATH正常。
要解决此问题,您可以在alpine上安装glibc(不建议使用),或者只是移至普通的Linux容器。

@edit:我的旧答案不正确,bash和sh默认情况下不提供/etc/profile的源代码,只有在提供-l选项的情况下。