运行 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
文件,但不能以其他方式。我不知道我是否遗漏了有关体系结构要求的某些内容(可能是)或者是错误。
无论如何,如果它对我找到解决方案的人有帮助,我已经在 运行 protoc
和 protoc-gen-grpc-web
.
中添加了带有必要 Dockerfile 的答案
获得像这样的非默认工具的最简单方法是通过底层 Linux 发行版的包管理器安装它们。
首先来看Docker Hub page for the node
image。 (对于像 node
这样的“图书馆”图像,构建 URL https://hub.docker.com/_/node
。)您会注意到那里有几个名为“alpine”、“buster”或“stretch”的变体; plain node:12
与 node:12-stretch
和 node: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 update
和 apt-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"
我正在尝试 运行 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
文件,但不能以其他方式。我不知道我是否遗漏了有关体系结构要求的某些内容(可能是)或者是错误。
无论如何,如果它对我找到解决方案的人有帮助,我已经在 运行 protoc
和 protoc-gen-grpc-web
.
获得像这样的非默认工具的最简单方法是通过底层 Linux 发行版的包管理器安装它们。
首先来看Docker Hub page for the node
image。 (对于像 node
这样的“图书馆”图像,构建 URL https://hub.docker.com/_/node
。)您会注意到那里有几个名为“alpine”、“buster”或“stretch”的变体; plain node:12
与 node:12-stretch
和 node: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 update
和 apt-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"