Контейнер-докер с параметром расширения точки входа и параметрами CMD

Я хочу создать Docker Image, которое будет исполняться как исполняемый файл, для которого пользователь передает токен в качестве переменной среды. Исполняемый файл имеет вспомогательные команды, которые пользователь должен передать через докеры CMD (подумайте о git с проверкой подлинности через Env). Однако Docker не добавляет CMD к точке входа. Соответствующая часть моего Dockerfile выглядит так:

ENTRYPOINT ["/bin/sh", "-c", "/usr/bin/mycmd --token=$MY_TOKEN"]
CMD ["pull", "stuff"]

Итак, если этот контейнер выполняется без каких-либо переопределений CMD и secret в качестве переменной MY_TOKEN, я ожидал бы

mycmd --token=secret pull stuff

для выполнения. Если пользователь запускает контейнер с переопределением, например

docker run -it -e MY_TOKEN=secret myimage push junk

Я ожидал бы

mycmd --token=secret push junk

для выполнения. Как упоминалось выше, однако, выполняется только mycmd --token=secret, CMD игнорируется - независимо от того, переопределяю ли я его во время запуска или устанавливаю его в файле Docker.

Ответ 1

С синтаксисом /bin/sh -c "script" все после аргумента -c становится аргументом для вашего script. Вы можете связаться с ними $0 и [email protected] как часть вашего /bin/sh script:

ENTRYPOINT ["/bin/sh", "-c", "exec /usr/bin/mycmd --token=$MY_TOKEN $0 [email protected]"]
CMD ["pull", "stuff"]

Обратите внимание, что вы также можете изменить свою точку входа на оболочку script, добавленную к вашему изображению, которая запускает exec /usr/bin/mycmd --token=$MY_TOKEN "[email protected]", и выполнить эту оболочку script с синтаксисом docker exec:

ENTRYPOINT ["/entrypoint.sh"]

Ответ 2

Как указано в документации docker, вы указываете точку входа, вызывающую оболочку (таким образом, не в форме оболочки, а exec один). Параметры передаются в оболочку (и поэтому игнорируются); имеет значение только команда в оболочке. Вы увидите, что ваша проблема решена после переключения вызова на входную точку:

ENTRYPOINT ["usr/bin/mycmd", "--token=$MY_TOKEN"]

Вызов оболочки в точке входа является чем-то сильно обескураженным и точно полезен только тогда, когда вы хотите, чтобы пользователи изображения не добавляли настраиваемые параметры к вашей точке входа.

Увидимся в сетях!:)