运行 protoc 命令进入 docker 容器

Run protoc command into docker container

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

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

/bin/sh: 1: protoc: not found

所以我假设我必须使用 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 的答案

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

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

对于基于 Debian 的软件包,您可以在 https://packages.debian.org/ (type protoc into the "Search the contents of packages" form at the bottom of the page). That leads you to the protobuf-compiler package 上查找软件包。知道包含 protoc 二进制文件,您可以将其安装在 Docker 文件中:

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 updateapt-get install 在同一个 RUN 命令中,以免后续重建从 Docker 构建缓存。如果我可以管理它,我通常只有一个 apt-get install 命令,为了便于维护,包按字母顺序逐行列出。

如果镜像是基于Alpine的,你可以在https://pkgs.alpinelinux.org/contents to find protoc上做类似的搜索,同样安装:

FROM node:12-alpine
RUN apk add --no-cache protoc
# The rest of your Dockerfile as above

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

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

即使是 答案也令人难以置信且如此完整,但它并没有解决我的问题,因为使用 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=...

因为这是目前 Google 上排名最高的结果,上面的说明将不起作用,如果您想使用 docker/dind 例如gitlab,这是让 glibc-dependency 为 protoc 工作的方法:

#!/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"