首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将protoc命令运行到docker容器中

将protoc命令运行到docker容器中
EN

Stack Overflow用户
提问于 2021-01-02 11:29:29
回答 3查看 9.7K关注 0票数 4

我正在尝试将protoc命令运行到一个码头容器中。

我试过使用gRPC图像,但是找不到protoc命令:

/bin/sh: 1:原型:未找到

因此,我假设我必须使用RUN指令手动安装,但是有更好的解决方案吗?安装了protoc的官方预编译映像?

此外,我尝试通过Dockerfile安装,但我再次获得了protoc: not found

这是我的Dockerfile

代码语言:javascript
复制
#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 echo $PATH,以确保文件夹在路径中,并且没有问题:

代码语言:javascript
复制
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

另外,检查RUN ls -la /usr/local/bin文件的protoc文件在文件夹中,它显示:

代码语言:javascript
复制
-rwxr-xr-x 1 root root   4849692 Jan  2 11:16 protoc

因此,文件位于/bin文件夹中,文件夹位于路径中。

我错过了什么吗?

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

提前谢谢。

编辑:解决了下载linux-x86_64压缩文件而不是x86_32的问题。我下载了较低的体系结构要求,认为x86_64机器可以运行x86_32文件,但不能以另一种方式运行。我不知道我是否遗漏了一些关于架构需求的东西(可能是),还是一个bug。

无论如何,如果这对我找到了解决方案的人有帮助,我已经在必要的Dockerfile中添加了一个运行protocprotoc-gen-grpc-web的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-03 21:18:28

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

问题是arch版本:我使用linux-x86_32.zip,但使用linux-x86_64.zip工作。

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

因此,我用来将protoc运行到码头容器中的Dockerfile如下所示:

代码语言:javascript
复制
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=...
票数 3
EN

Stack Overflow用户

发布于 2021-01-02 12:28:57

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

首先,看看图像。(对于像node这样的“库”图像,请构造https://hub.docker.com/_/node。)您会注意到,有几个变体名为“高寒”、"buster“或”拉伸“;普通node:12node:12-stretchnode:12.20.0-stretch相同。“阿尔卑斯”映像基于阿尔卑斯Linux;"buster“和”拉伸“是Debian /Linux的不同版本。

对于基于Debian的包,您可以在https://packages.debian.org/上查找包(在页面底部的“搜索包的内容”表单中键入protoc )。这就带你去了套餐。知道包含protoc二进制文件后,您可以在您的Dockerfile中安装它:

代码语言:javascript
复制
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 ...

通常您必须在相同的apt-get update命令中运行apt-get installRUN命令,以免随后的重构从Docker缓存中获得包缓存的旧版本。如果我能够管理它,通常只有一个apt-get install命令,包列表按字母顺序排列为一行,以提高可维护性。

如果图像是基于阿尔卑斯山的,您可以在https://pkgs.alpinelinux.org/contents上进行类似的搜索以找到protoc,并类似地安装它:

代码语言:javascript
复制
FROM node:12-alpine
RUN apk add --no-cache protoc
# The rest of your Dockerfile as above
票数 8
EN

Stack Overflow用户

发布于 2022-04-08 10:06:24

由于这是目前在谷歌上排名最高的结果,上面的说明将不起作用,如果您想将docker/dind用于例如gitlab,这就是如何使glibc依赖关系在protoc上工作的方法:

代码语言:javascript
复制
#!/bin/bash

# install gcompat, because protoc needs a real glibc or compatible layer
apk add gcompat

# install a recent protoc (use a version that fits your needs)
export PB_REL="https://github.com/protocolbuffers/protobuf/releases"
curl -LO $PB_REL/download/v3.20.0/protoc-3.20.0-linux-x86_64.zip
unzip protoc-3.20.0-linux-x86_64.zip -d $HOME/.local
export PATH="$PATH:$HOME/.local/bin"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65538591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档