Контейнер докера c расширением переменной entrypoint и параметрами CMD

Я хочу создать образ Docker, который действует как исполняемый файл, для которого пользователь передает токен в качестве переменной среды. В исполняемом файле есть команды sub, которые пользователь должен передать через Dockers 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 игнорируется-независимо от того, переопределяю ли я его во время запуска или устанавливаю в Dockerfile.

2 ответов


С /bin/sh -c "script" синтаксис, что после -c аргумент становится аргументом для вашего скрипта. Вы можете добраться до них с и $@ как часть вашего скрипта /bin/sh:

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

обратите внимание, что вы также можете изменить entrypoint в качестве сценария оболочки, добавленного к вашему изображению, которое работает exec /usr/bin/mycmd --token=$MY_TOKEN "$@" и выполните этот сценарий оболочки с синтаксисом exec docker:

ENTRYPOINT ["/entrypoint.sh"]

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

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

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

увидимся в паутине! :)