Как запустить docker-compose при загрузке?

20

Это на виртуальной машине Ubuntu 14.04 LTS с Docker, и я подозреваю, что это respawnявляется причиной моей проблемы, но я не уверен в идеальном решении.

Текущий сценарий upstart ( cat /etc/init/dockersuitecrm.conf)

description "Start docker containers"
author "Batman"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
    docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start
end script

Это «работает» в том, что myappживой и отзывчивый, но /sbin/initзанимает весь процессор, когда я контролирую с htop. Если я удаляю запись из upstart ( sudo rm /etc/init/dockersuitecrm.conf) и вручную запускаю и запускаю SSH, docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp startя не вижу процессора на 100% и, как и прежде myapp, снова жив и отзывчив.

Так что я подозреваю, что способ запуска docker-compose выше неверен. Какой правильный способ запуска docker-composeвсегда работает без ручного вмешательства?

РЕДАКТИРОВАТЬ: не должно иметь значения, но /usr/bin/myapp -> /home/batman/dockerapps/myappкак символическая ссылка.

DeepSpace101
источник
Не решение, а как обходной путь, я могу запустить это без respawnкоманды в сценарии.
DeepSpace101
Тот же вопрос, но я видел это: serverfault.com/questions/615820/… . Магия в использовании docker-compose start.
Марк Лопес
У меня есть похожий конфиг, но я не использую scriptблок. Может быть, это является частью проблемы? У меня есть chdir /usr/bin/myapp/и на следующей строке exec docker-compose upвместо.
jmreicha
Разве вы не хотите запускать docker-compose в фоновом режиме? т.е.docker-compose up -d
KCD
поставить рестарт: всегда в спецификации контейнера
Lu32

Ответы:

9

Просто используйте crontab, вместо того, чтобы использовать интервал времени, просто скажите @reboot

Так войдите как пользователь, который должен запустить этот скрипт и введите команду

crontab -e

а затем введите

@reboot /better/enter/fullpath/here/docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start

Перезагрузите систему и посмотрите, работает ли она. Есть одно преимущество перед выскочкой, даже если это началось немного позже, вам не нужно сильно беспокоиться о таких зависимостях, как работа в сети и т. Д., Чтобы уже быть в курсе.

s1mmel
источник
Есть идеи, насколько чистой будет перезагрузка?
Джастин Смит
1
Извините, но это не очень хороший ответ. Это может работать время от времени, но, поскольку cron может быть загружен раньше других требований докера, вы попадаете в состояние гонки.
Отей
2

Предполагая, что вы используете версии 2 определений Docker Compose docker-compose.yml, вы можете сделать следующее:

Определяя restart: alwaysтак:

version: '2'
services:
  web:
    image: nginx
    restart: always

Ссылка: https://docs.docker.com/compose/compose-file/compose-file-v2/

Сергей Филиппов
источник
1
Вопрос, на который сайт докера не отвечает, был: «Какой правильный способ начать сборку docker всегда выполняется без ручного вмешательства?»
Отей
0

Docker не готов немедленно. Если вы запустите скрипт слишком рано, ничего не произойдет. Докер начнет отвечать на команду docker ps, как только она будет готова, так что вы можете использовать этот трюк в crontab:

nano / etc / crontabs / root

@reboot / usr / bin / docker ps && / usr / bin / docker-compose -f /prod.yml start

Евгений Савелов
источник