linux 在运行协议缓冲区的基于Alpine的Docker容器上出现“protoc:not found”

h43kikqp  于 2022-11-02  发布在  Linux
关注(0)|答案(3)|浏览(181)

我尝试构建一个简单的容器,从发布页面(https://github.com/protocolbuffers/protobuf/releases/tag/v3.13.0)下载一个Protocol Buffers二进制文件,并将其添加到路径中。

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不能在这个容器中执行吗?

ecfdbz9o

ecfdbz9o1#

正如KamilCuk所指出的,Alpine使用musl作为它的C标准库,而二进制文件是针对glibc编译的。我的解决方案是使用golang基础映像(它基于Buster Linux)而不是golang:alpine

FROM golang

# Install protoc (cf. http://google.github.io/proto-lens/installing-protoc.html)

ENV PROTOC_ZIP=protoc-3.13.0-linux-x86_64.zip
RUN apt-get update && apt-get install -y unzip
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
cbjzeqam

cbjzeqam2#

如今,您只需购买标准套餐即可:

FROM golang:alpine

RUN apk update && apk add --no-cache make protobuf-dev
wfveoks0

wfveoks03#

实际上,你可以根据documentation从源代码构建protoc。我使用的是docker image, which is an alpine-based image,并且没有它的Buster基础映像。以下是我的Dockerfile:

FROM docker:20.10.12

RUN apk update && apk add curl bash unzip build-base autoconf automake libtool make g++
ENV PROTOBUF_VERSION 3.19.4
ENV PROTOBUF_URL https://github.com/google/protobuf/releases/download/v"$PROTOBUF_VERSION"/protobuf-cpp-"$PROTOBUF_VERSION".zip
RUN curl --silent -L -o protobuf.zip "$PROTOBUF_URL" && \
    unzip protobuf.zip && \
    cd protobuf-"$PROTOBUF_VERSION" && \
    ./configure && \
    make -j$(nproc) && \
    make install && \
    cd .. && rm protobuf.zip

然后构建图像:

docker build . -t protoc:0.0.1

构建完成后,您可以像这样测试它:

docker run --rm -it --entrypoint bash protoc:0.0.1
bash-5.1# protoc --version
libprotoc 3.19.4

相关问题