2

我正在尝试构建一个 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 的情况下构建并运行它时,它运行没有问题。然而,容器内的外壳不知何故无法看到/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

这里可能是什么问题?

4

1 回答 1

3

protobuf 与glibc库链接,alpine 使用musl(而旧的 alpine 使用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选项时才提供。

于 2018-07-13T09:09:35.340 回答