Есть ли простой способ автоматически запускать скрипт при каждом (пере) запуске контейнера? - PullRequest
1 голос
/ 11 июня 2019

Я создал образ Docker, скопировал в него сценарий и автоматически запустил его при запуске образа, благодаря этой команде Dockerfile:

ENTRYPOINT ["/path/to/script/my_script.sh"]

(Iдолжен был дать ему права chmod в команде RUN, чтобы фактически запустить ее)

Теперь я довольно новичок в Docker, поэтому я не уверен, что то, что я хочу сделать, является даже хорошей практикой:

Моя основная идея заключается в том, что мне не всегда нужно создавать новый контейнер всякий раз, когда я хочу запустить этот скрипт, а вместо этого найти способ повторно выполнить этот скрипт всякий раз, когда я (повторно) запускаю тот же контейнер.

Таким образом, вместо того, чтобы набирать docker run my_image, выполнить то же самое с помощью docker (re)start container_from_image.

Существует ли простой способ сделать это, и имеет ли он смысл из ресурсаэкономная перспектива?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Для проблемы chmod вы можете сделать что-то вроде этого

COPY . /path/to/script/my_script.sh
RUN chmod 777 -R /path/to/script/my_script.sh

Для проблемы повторного запуска скрипта

ENTRYPOINT указывает командуэто всегда будет выполняться при запуске контейнера.

Это может быть либо

docker run container_from_image

или

docker start container_from_image

Так что всякий раз, когда ваш контейнер запускает, ваша команда ENTRYPOINT будетбыть казненным.

Вы можете сослаться это для более подробной информации

1 голос
/ 11 июня 2019

docker run довольно дешево, и типичная модель Docker обычно состоит в том, что вы всегда начинаете с «чистого листа» и настраиваете все оттуда.Контейнер Docker не имеет такого же набора перехватов pre-start / post-start / ..., как, например, у systemd;есть только механизм ENTRYPOINT / CMD.Теперь у вас все в порядке.

Также помните, что вам необходимо удалять и воссоздавать контейнеры для различных рутинных изменений, при этом наиболее важным в долгосрочной перспективе является удаление контейнера для изменениябазовый образ (потому что установленное программное обеспечение или базовый дистрибутив Linux содержит критическую ошибку, которую нужно исправить).Мне кажется, что рабочий процесс, построенный вокруг docker build / run / stop / rm, является «самой Dockery» и хорошо согласуется с шаблоном неизменной инфраструктуры.Повторное docker stop / start в качестве рабочего процесса означает, что вы пытаетесь сохранить этот конкретный контейнер живым, и в большинстве случаев это не должно иметь значения.

С технической точки зренияВ поле зрения вы можете представить себе контейнерную среду и ее файловую систему, а также основной процесс внутри контейнера.docker run на самом деле docker create плюс docker start.Я никогда не замечал, что половина «создания» занимает значительное время, но если вы делаете что-то вроде запуска JVM или загрузки большого набора данных при запуске, половина «запуска» будет медленной независимо от того, связана ли она с созданиемновый контейнер.

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