2015-03-16 2 views
3

Я создаю мой Docker контейнер в отдельном режиме с помощью следующей команды:докер контейнер начал в режиме Отдельностоящего остановлен после выполнения процесса

docker run [OPTIONS] --name="my_image" -d container_name /bin/bash -c "/opt/init.sh" 

так что мне нужно, что «/opt/init.sh» выполняется в контейнере создается. То, что я увидел, что контейнер остановлен после завершения выполнения скриптов.

Как сохранить контейнер в отрыве со сценарием/выполнением сервисов при создании контейнера?

ответ

0

Контейнер Docker выйдет, когда закончится его основной процесс. В этом случае это означает, когда заканчивается init.sh. Если вы только пытаетесь запустить одно приложение, вы можете просто использовать exec, чтобы запустить его в конце, убедившись, что он запускается на переднем плане. Использование exec эффективно превратит вызываемый сервис/приложение в основной процесс.

Если у вас есть несколько сервисов для запуска, вам лучше использовать диспетчер процессов, например supervisord или runit. Вам нужно будет запустить демон диспетчера процессов на переднем плане. Документация Docker включает в себя: example of using supervisord.

+0

это причина, мне нужно запустить его в режиме отдельностоящий/фона. как насчет использования «daemontools». Кто-то использовал это и работает ли он на мое дело? http://stage1.io/blog/running-services-in-a-docker-container-with-daemon-tools/ –

+0

Что значит «it» в «Мне нужно запустить его»? Нет проблем с отсоединением контейнера, используя только что описанный процесс. –

+0

Нормальным решением является использование диспетчера процессов, а Docker, похоже, склоняется к супервизору. Phusion использует runit. –

1

Есть 2 режима работы Docker контейнера

  1. Отдельный режим - В этом режиме вы выполняете команду и прекращает контейнер после того, как команда выполнена
  2. Foreground режим - это режим, когда вы запускаете Баш оболочку, но также прекратит контейнер после выхода из корпуса

Что вам нужно, это Фоновый режим. Это не указано в параметрах, но есть много способов сделать это.

  1. Выполнение бесконечной команды в отдельном режиме, поэтому команда никогда не заканчивается, и контейнер не останавливается. Я обычно использую «хвост -f/DEV/нуль» просто потому, что это довольно легкий вес и/DEV/нуль присутствует в большинстве Linux-системы

докер запуска -d --name = Имя контейнера хвост - е/DEV/нуль

Затем вы можете колотить, чтобы контейнер работает так:

докер Exec -это имя/бен/Баш -l

Если вы используете параметр -l, он будет входить в качестве режима входа в систему, который будет выполнять .bashrc, как обычный вход в bash. В противном случае вам нужно снова включить снова вручную вручную

  1. Точка входа - вы можете создать любой скрипт sh, такой как /entrypoint.sh. в entrypoint.sh вы можете запустить любой бесконечный сценарий, а

#!/bin/ш

#/EntryPoint.ш

перезапуск службы MySQL

...

хвост -f/DEV/нуль < - это никогда не заканчивается

После сохранения entrypoint.sh, CHMOD а + х на нем, выход докер Баш, затем запустить его так:

Docker запустить --name = имя контейнера --entrypoint /entrypoint.sh

Это позволяет каждому контейнеру иметь свой собственный сценарий запуска, и вы можете запустить их, не заботясь о вложении сценарий запуска каждый раз, когда

Смежные вопросы