Как говорит @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
являются критическими.)