Переопределить Dockerfile CMD командой docker run с аргументами - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть Dockerfile с CMD.Я хочу переопределить эту команду командой docker run, но в моей команде есть аргументы.команда выглядит примерно так: MyAppName -DataBase myDataBase -Port myPort -AnotherARG arg Аргументы - это разница при любом запуске контейнера, это означает, что я не должен указывать все аргументы при каждом запуске контейнера (существует множество аргументов), как я могу это сделатьэтот?Спасибо

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Как говорит @grapes в своем ответе,

Аргументы, представленные в docker run, объединяются в Dockerfile s ENTRYPOINT

Таким образом, вы можетенаписать собственный ENTRYPOINT сценарий, который просматривает передаваемую команду и переписать ее, если вам нужно.

#!/bin/sh
#
# docker-entrypoint.sh
#
# The Dockerfile CMD, or any "docker run" command option, gets
# passed as command-line arguments to this script.

# Abort on any error (good shell hygiene)
set -e

# If we're running "myAppName", provide default options
if [ "$1" = "MyAppName" ]; then
  # Remove the command from the option list (we know it)
  shift

  # Then run it with default options plus whatever else
  # was given in the command
  exec MyAppName -OptionOne default -OtherOption foo "$@"
fi

# Otherwise just run what was given in the command
exec "$@"

Условный блок обеспечивает, например, если вы хотите отладочную оболочку сdocker run --rm -it ... sh в него не добавляются специфичные для вашего приложения параметры. Здесь вы можете получить сколь угодно сложную задачу, установить переменные среды по умолчанию, попытаться выполнить дальнейший анализ командной строки и т. Д.Важно exec основной процесс в сценарии точки входа, чтобы приложение стало основным контейнерным процессом и не оставляло точку входа в качестве родительского (вы хотите, чтобы docker stop отправлял свои сигналы вашему процессу, а не оболочкеshell).

Снова цитируем @grapes:

Вы должны использовать синтаксис ENTRYPOINT ['blah', 'blah'] вместо ENTRYPOINT blah blah в Dockerfile, чтобы это работало

Таким образом, ваш Dockerfile может заканчиваться следующим образом:

...
COPY docker-entrypoint.sh /
RUN chmod +x docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["MyAppName"]

(Шаг chmod не требуется, если файл уже выполняется в вашей локальной системе, прежде чем он получит COPY d. Квадратные скобкии кавычки на ENTRYPOINT и CMD являются критическими.)

0 голосов
/ 19 декабря 2018

Так в чем проблема?

Если командная строка полностью отличается при каждом запуске, вам лучше не объявлять CMD или ENTRYPOINT на вашем Dockerfile, а указывать его каждый раз при запуске:

docker run -it ubuntu /bin/sh -c "echo Hello World"

Если есть общая часть, допустим, вам всегда нужна оболочка, но аргументы разные, то вы объявляете ENTRYPOINT в вашем Dockerfile, например:

Dockerfile

FROM ubuntu
....
ENTRYPOINT ['/bin/sh']

И предоставить остальные аргументы при запуске:

docker run -it mycontainer -c 'Hello World!

Вам необходимо запомнить:

  • Аргументы, предоставленные в docker run, объединяются в Dockerfile s ENTRYPOINT

  • Аргументы, предоставленные в docker run override Dockerfile s CMD

  • Вы должны использоватьENTRYPOINT ['blah', 'blah'] синтаксис вместо ENTRYPOINT blah blah в Dockerfile, чтобы это работало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...