【问题标题】:Run protoc command into docker container将 protoc 命令运行到 docker 容器中
【发布时间】:2021-04-08 19:47:02
【问题描述】:

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

我尝试使用gRPC image,但找不到protoc 命令:

/bin/sh: 1: protoc: 未找到

所以我假设我必须使用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 echo $PATH 以确保文件夹在路径中并且正常:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

另外RUN ls -la /usr/local/bin 来检查protoc 文件是否在文件夹中并显示:

-rwxr-xr-x 1 root root   4849692 Jan  2 11:16 protoc

所以文件在/bin文件夹中,文件夹在路径中。

我错过了什么吗?

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

提前致谢。

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

无论如何,如果它对我找到解决方案的人有所帮助,我已经添加了一个答案,其中包含运行 protocprotoc-gen-grpc-web 所需的 Dockerfile。

【问题讨论】:

    标签: docker protocol-buffers grpc proto grpc-node


    【解决方案1】:

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

    首先,查看Docker Hub page for the node image。 (对于像node 这样的“库”图像,构建URL https://hub.docker.com/_/node。)你会注意到那里有几个变体,名为“alpine”、“buster”或“stretch”;普通的node:12node:12-stretchnode:12.20.0-stretch 相同。 “alpine”镜像基于 Alpine Linux; “buster”和“stretch”是 Debian GNU/Linux 的不同版本。

    对于基于 Debian 的软件包,您可以在 https://packages.debian.org/ 上查找该软件包(在页面底部的“搜索软件包内容”表单中输入 protoc)。这会将您带到protobuf-compiler package。知道其中包含 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 命令中运行 apt-get updateapt-get install,以免后续重建从 Docker 构建缓存中获取旧版本的包缓存。如果我可以管理它,我通常只有一个 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
    

    【讨论】:

    • 非常感谢您的解释,但apt-get 安装的是 3.0.0 版本,而不是 3.14.0。我将测试 3.0.0 是否也可以正常工作。再次感谢!
    【解决方案2】:

    终于解决了我自己的问题。

    问题出在 Arch 版本上:我使用的是 linux-x86_32.zip,但使用的是 linux-x86_64.zip

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

    所以,我用来在 docker 容器中运行 protoc 的 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=...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-30
      • 2019-03-08
      • 2020-03-03
      • 1970-01-01
      • 2020-06-24
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多