Контейнер-докер с параметром расширения точки входа и параметрами 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"]
Вызов оболочки в точке входа является чем-то сильно обескураженным и точно полезен только тогда, когда вы хотите, чтобы пользователи изображения не добавляли настраиваемые параметры к вашей точке входа.
Увидимся в сетях!:)