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_64
zip 文件而不是x86_32
. 我下载了较低的架构要求,认为x86_64
机器可以运行x86_32
文件,但不能以其他方式运行。我不知道我是否遗漏了一些有关架构要求的内容(可能是)或者是一个错误。
无论如何,如果它可以帮助某人,我找到了解决方案,并且我添加了一个答案以及运行所需的 Dockerfileprotoc
和protoc-gen-grpc-web
.
获取此类非默认工具的最简单方法是通过底层 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-stretch
node: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 install
RUN
apt-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)
最后我解决了我自己的问题。
问题是 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)
归档时间: |
|
查看次数: |
15985 次 |
最近记录: |