Контейнер докера 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.
увидимся в паутине! :)