在 docker 容器中运行 protoc 命令

J.F*_*.F. 7 protocol-buffers proto docker grpc grpc-node

我正在尝试将protoc命令运行到 docker 容器中。

我尝试使用gRPC 映像,但未protoc找到命令:

/bin/sh: 1: 协议:未找到

所以我假设我必须使用RUN说明手动安装,但是有更好的解决方案吗?已安装官方预编译映像protoc

另外,我尝试通过 Dockerfile 安装,但又出现了protoc: not found

这是我的 Dockerfile

#I'm not using "FROM grpc/node" because that image can't unzip
FROM node:12 

...

# Download proto zip
ENV PROTOC_ZIP=protoc-3.14.0-linux-x86_32.zip
RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/${PROTOC_ZIP}
RUN unzip -o ${PROTOC_ZIP} -d ./proto 
RUN chmod 755 -R ./proto/bin
ENV BASE=/usr/local
# Copy into path
RUN cp ./proto/bin/protoc ${BASE}/bin
RUN cp -R ./proto/include/* ${BASE}/include

RUN protoc -I=...
Run Code Online (Sandbox Code Playgroud)

我已RUN echo $PATH确保该文件夹位于路径中并且正常:

#I'm not using "FROM grpc/node" because that image can't unzip
FROM node:12 

...

# Download proto zip
ENV PROTOC_ZIP=protoc-3.14.0-linux-x86_32.zip
RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/${PROTOC_ZIP}
RUN unzip -o ${PROTOC_ZIP} -d ./proto 
RUN chmod 755 -R ./proto/bin
ENV BASE=/usr/local
# Copy into path
RUN cp ./proto/bin/protoc ${BASE}/bin
RUN cp -R ./proto/include/* ${BASE}/include

RUN protoc -I=...
Run Code Online (Sandbox Code Playgroud)

还要RUN ls -la /usr/local/bin检查protoc文件是否进入文件夹,它显示:

-rwxr-xr-x 1 root root   4849692 Jan  2 11:16 protoc
Run Code Online (Sandbox Code Playgroud)

所以该文件位于 /bin 文件夹中,该文件夹位于路径中。

我错过了什么吗?

另外,有没有一种简单的方法来获取已安装的映像protoc?或者最好的选择是生成我自己的图像并从我的存储库中提取?

提前致谢。

编辑:解决了下载linux-x86_64zip 文件而不是x86_32. 我下载了较低的架构要求,认为x86_64机器可以运行x86_32文件,但不能以其他方式运行。我不知道我是否遗漏了一些有关架构要求的内容(可能是)或者是一个错误。

无论如何,如果它可以帮助某人,我找到了解决方案,并且我添加了一个答案以及运行所需的 Dockerfileprotocprotoc-gen-grpc-web.

Dav*_*aze 9

获取此类非默认工具的最简单方法是通过底层 Linux 发行版的包管理器安装它们。

首先,查看Docker Hub 页面上的node镜像。(对于“库”图像,如node,请构造 URL https://hub.docker.com/_/node。)您会注意到,有多种名为“alpine”、“buster”或“stretch”的变体;plain与和node:12相同。“alpine”镜像基于 Alpine Linux;“buster”和“stretch”是 Debian GNU/Linux 的不同版本。node:12-stretchnode:12.20.0-stretch

对于基于 Debian 的软件包,您可以在https://packages.debian.org/上查找该软件包(protoc在页面底部的“搜索软件包内容”表单中输入)。这将引导您找到protobuf-compiler包裹。知道其中包含protoc二进制文件后,您可以使用以下命令将其安装到 Dockerfile 中:

FROM node:12 # Debian-based
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      protobuf-compiler
# The rest of your Dockerfile as above
COPY ...
RUN protoc ...
Run Code Online (Sandbox Code Playgroud)

通常,您必须在同一命令中运行apt-get update和,以免后续重建从 Docker 构建缓存中获取旧版本的包缓存。如果我能管理的话,我通常只有一个命令,包列表按字母顺序排列为一行,以便于维护。apt-get installRUNapt-get install

如果镜像是基于 Alpine 的,您可以在https://pkgs.alpinelinux.org/contents上进行类似的搜索来查找protoc,并类似地安装它:

FROM node:12-alpine
RUN apk add --no-cache protoc
# The rest of your Dockerfile as above
Run Code Online (Sandbox Code Playgroud)


J.F*_*.F. 3

最后我解决了我自己的问题。

问题是 arch 版本:我正在使用linux-x86_32.zip但可以使用linux-x86_64.zip

即使@David Maze 的答案也令人难以置信且完整,它并没有解决我的问题,因为使用apt-get安装版本3.0.0并且我想要3.14.0

所以,我用来运行protoc到 docker 容器的 Dockerfile 是这样的:

FROM node:12

... 

# Download proto zip
ENV PROTOC_ZIP=protoc-3.14.0-linux-x86_64.zip
RUN curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/${PROTOC_ZIP}
RUN unzip -o ${PROTOC_ZIP} -d ./proto 
RUN chmod 755 -R ./proto/bin
ENV BASE=/usr
# Copy into path
RUN cp ./proto/bin/protoc ${BASE}/bin/
RUN cp -R ./proto/include/* ${BASE}/include/

# Download protoc-gen-grpc-web
ENV GRPC_WEB=protoc-gen-grpc-web-1.2.1-linux-x86_64
ENV GRPC_WEB_PATH=/usr/bin/protoc-gen-grpc-web
RUN curl -OL https://github.com/grpc/grpc-web/releases/download/1.2.1/${GRPC_WEB}
# Copy into path
RUN mv ${GRPC_WEB} ${GRPC_WEB_PATH}
RUN chmod +x ${GRPC_WEB_PATH}

RUN protoc -I=...
Run Code Online (Sandbox Code Playgroud)