Ответ 1
Вы можете использовать ENTRYPOINT
или CMD
в вашем Dockerfile, чтобы выполнить команду при запуске контейнера. Разница между ними заключается в том, что ENTRYPOINT
выполняется каждый раз, когда запускается контейнер, а CMD
может быть заменен параметром командной строки. Предполагая, что вы хотите выполнить команду X
docker run my-image Y
выполнит X
, если ENTRYPOINT X
был в Dockerfile, и Y
, если CMD X
был в Dockerfile.
Однако есть две оговорки:
- Команда будет выполняться каждый раз при запуске контейнера.
- После завершения команды контейнер закрывается.
Поэтому типичным решением является наличие скрипта docker-entrypoint
. Он проверяет, запущен ли он в новом контейнере, инициируя его среду, и затем выполняет реальную программу контейнера.
Взгляните на официальный MySQL Dockerfile и точку входа, чтобы получить представление.
Пример сценария точки входа может выглядеть следующим образом:
$ cat docker_entrypoint.sh
if [ ! -f .initialized ]; then
echo "Initializing container"
# run initializing commands
touch .initialized
fi
exec "[email protected]"
Сначала проверяется, существует ли файл с именем .initialized
. Если его нет, запускаются некоторые команды для инициализации среды контейнера. После чего touch .initialized
создает .initialized
как пустой файл. Следовательно, последующие запуски контейнера больше не будут выполнять команду инициализации.
Во-вторых, запускается фактическое обслуживание. Выполнение этого с exec
заменит процесс оболочки на процесс обслуживания. Следовательно, docker будет поддерживать работу контейнера до тех пор, пока служба не прекратит работу. "[email protected]"
будет содержать "команду контейнера/изображения". Это устанавливается с помощью CMD X
в Dockerfile и переопределяется по команде, как я уже указывал выше. Используя exec "[email protected]"
, вы сможете запускать различные программы в контейнере для проверки, например, bash
и запустите службу по умолчанию, как указано в операторе Dockerfile CMD
.