【发布时间】:2020-10-20 14:52:13
【问题描述】:
我正在尝试构建一个简单的容器,该容器从发布页面 (https://github.com/protocolbuffers/protobuf/releases/tag/v3.13.0) 下载 Protocol Buffers 二进制文件并将其添加到路径中。按照http://google.github.io/proto-lens/installing-protoc.html 的 Linux 说明,我尝试了以下Dockerfile:
FROM golang:alpine
# Install protoc (cf. http://google.github.io/proto-lens/installing-protoc.html)
RUN apk add curl
ENV PROTOC_ZIP=protoc-3.13.0-linux-x86_64.zip
RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.13.0/$PROTOC_ZIP \
&& unzip -o $PROTOC_ZIP -d /usr/local bin/protoc \
&& unzip -o $PROTOC_ZIP -d /usr/local 'include/*' \
&& rm -f $PROTOC_ZIP
问题是,如果我使用它构建它
docker build --tag docker-protoc .
并在其中运行一个 shell,我得到一个 protoc: not found 错误,即使二进制文件在 /usr/local/bin 中,它在 PATH 中:
> docker run -it docker-protoc /bin/ash
/go # protoc
/bin/ash: protoc: not found
/go # ls /usr/local/bin
protoc
/go # echo $PATH
/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/go #
我还想到,我可能下载了一个不能在 Alpine Linux 上运行的 protoc 版本,但 linux-x86_64 后缀似乎与容器的架构相匹配:
/go # uname -m
x86_64
知道为什么protoc 不能在这个容器中执行吗?
【问题讨论】:
-
Any idea因为 alpine 使用 musl,并且二进制文件是针对 glibc 编译的 -
正如@KamilCuk 提到的它缺少
glibc,这可以通过安装apk add gcompatwiki.alpinelinux.org/wiki/Running_glibc_programs 来解决
标签: linux docker protocol-buffers protoc