Сценарий Upstart для запуска контейнера не будет управлять жизненным циклом


У меня есть сценарий выскочки (скажем, /etc/init/dtest.conf)

start on runlevel [2345]
stop on runlevel [!2345]
respawn
script
  DID=$(docker.io run -d ubuntu /bin/bash -c "echo Starting;sleep 20;echo Stopping")
  docker.io attach $DID
end script

При выдаче start dtest, журналы выскочек показывают правильный цикл "запуска ... Остановка " навсегда.

Однако, если я выдам stop dtest, то он, по-видимому, выйдет правильно, но контейнер будет работать в течение оставшегося времени сна (о чем свидетельствует запуск docker.io ps каждую секунду).

Разве не должен быть простой способ запустить образ docker в контейнере с upstart и управлять его жизненным циклом там?

Мой идеал сценарий будет примерно таким:

start on runlevel [2345]
stop on runlevel [!2345]
respawn
exec docker.io run -d ubuntu /bin/bash -c "echo Starting;sleep 20;echo Stopping"

Среда: это на AWS, используя Ubuntu 14.04 в T2.микро, причем apt-get install -y docker.io является единственной установленной вещью

1 2

1 ответ:

Вы должны создать именованный контейнер, выполнив следующую команду:

docker run --name dtest ubuntu /bin/bash -c "echo Starting;sleep 20;echo Stopping"

Затем создайте следующий сценарий upstart (обратите внимание на флаг -a), который будет управлять жизненным циклом этого контейнера, как вы ожидаете

start on runlevel [2345]
stop on runlevel [!2345]
respawn
script
  /usr/bin/docker start -a dtest
end script

Я бы также предложил добавить флаг -r в сценарий выполнения главного демона docker, чтобы docker не перезапускал ваши контейнеры автоматически при перезапуске хоста (вместо этого это будет сделано выскочкой сценарий)

sudo sh -c "echo 'DOCKER_OPTS=\"-r=false\"' > /etc/default/docker"

Процесс настройки контейнеров Docker для работы с менеджерами процессов, такими как upstart, описан очень подробно Здесь