Запустите команду protoc в контейнере докеров

Я пытаюсь запустить команду protoc в док-контейнер.

Я пытался использовать gRPC-образ, но команда protoc не найдена:

/bin/sh: 1: протокол: не найден

Итак, я предполагаю, что мне нужно установить вручную, используя инструкции RUN, но есть ли лучшее решение? Официальный предварительно скомпилированный образ с установленным protoc?

Кроме того, я пытался установить через Dockerfile, но снова получаю protoc: not found.

Это мой докерфайл

#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? или лучший вариант — сгенерировать собственный образ и извлечь его из моего репозитория?

Заранее спасибо.

Изменить: решена загрузка ZIP-файла linux-x86_64 вместо x86_32. Я загрузил более низкие требования к архитектуре, думая, что машина x86_64 может запускать файл x86_32, но не наоборот. Я не знаю, упускаю ли я что-то из требований к архитектуре (вероятно) или это ошибка.

В любом случае, если это кому-то поможет, я нашел решение и добавил ответ с необходимым Dockerfile для запуска protoc и protoc-gen-grpc-web.


person J.F.    schedule 02.01.2021    source источник


Ответы (2)


Самый простой способ получить подобные инструменты не по умолчанию — установить их через диспетчер пакетов базового дистрибутива Linux.

Во-первых, посмотрите на страницу Docker Hub для node образа. (Для библиотечных изображений, таких как node, создайте URL-адрес https://hub.docker.com/_/node.) Вы заметите, что здесь есть несколько вариантов с именами alpine, buster или stretch; обычный node:12 такой же, как node:12-stretch и node:12.20.0-stretch. Образы Alpine основаны на Alpine Linux; buster и stretch — разные версии Debian GNU/Linux.

Пакеты на основе 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 ...

Как правило, вы должны запускать apt-get update и apt-get install в одной и той же команде RUN, чтобы последующая перестройка не получила старую версию кеша пакетов из кеша сборки 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
person David Maze    schedule 02.01.2021
comment
Большое спасибо за объяснение, но apt-get устанавливайте версию 3.0.0, а не 3.14.0. Я тоже проверю, нормально ли работает 3.0.0. Спасибо еще раз! - person J.F.; 02.01.2021

Наконец-то я решил свою проблему.

Проблема заключалась в арочной версии: я использовал linux-x86_32.zip, но работает с linux-x86_64.zip

Даже ответ @David Maze невероятен и настолько полон, что не решил мою проблему, потому что с помощью apt-get install version 3.0.0 и я хотел 3.14.0.

Итак, файл Dockerfile, который я использовал для запуска protoc в контейнере Docker, выглядит следующим образом:

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=...
person J.F.    schedule 03.01.2021