примечание: это не работает
ENTRYPOINT ["/usr/bin/foo", "$ENV_VAR"]
CMD ["--some-flag"]
Это будет запускать foo с $ENV_VAR
в качестве первого аргумента и --some-flag
в качестве второго аргумента. Вам нужно, чтобы $ENV_VAR
был переведен в значение переменной среды, и это делается с помощью оболочки. Синтаксис json для ENTRYPOINT / CMD явно отключает оболочку, поэтому ваш исполняемый файл может расширить это значение.
Если вы попытаетесь изменить ENTRYPOINT на синтаксис оболочки с помощью:
ENTRYPOINT /usr/bin/foo "$ENV_VAR"
CMD ["--some-flag"]
Вы найдете, что докер переводит это на выполнение:
/bin/sh -c "/usr/bin/foo \"$ENV_VAR\"" "--some-flag"
И если вы посмотрите документацию по опции -c
, вы увидите, что для этого требуется только один аргумент. Так что эта опция не будет работать для опции --some-flag
, которая передается вне кавычек.
Самое простое решение - переместить его в сценарий оболочки:
#!/bin/sh
exec /usr/bin/foo "$ENV_VAR" "$@"
Скопируйте это как entrypoint.sh в ваш контейнер:
COPY entrypoint.sh /
RUN chmod 755 /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["--some-flag"]
Обратите внимание, что команда chmod необходима только в том случае, если вы не можете сделать свой скрипт исполняемым на всех сборочных хостах / в репозиториях кода (иногда это наблюдается у пользователей Windows).