gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:21:44 26 4
gpt4 key购买 nike

我正在尝试构建一个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

这可能是什么问题?

最佳答案

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选项时。

关于bash - Docker在容器内的PATH中看不到二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51321104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com