Як запустити docker-compose up -d при запуску системи?


114

Щоб дозволити контейнерам автоматично запуститися в точці запуску, я спробував додати команду:

cd directory_has_docker-compose.yml && docker-compose up -d в /etc/rc.local.

але потім після перезавантаження машини контейнери не працюють.

Як працювати docker-compose up -dпри запуску системи?


3
використання --restart alwaysабо --restart unless-stoppedв докер-compose.yml використання restart: always-> Реф . Але, можливо, не працювали на деяких контейнерах!
Бенямін Джафарі

Відповіді:


131

Коли ми використовуємо crontabабо застарілий /etc/rc.localфайл, нам потрібна затримка (наприклад sleep 10, залежно від машини), щоб переконатися, що доступні системні послуги. Зазвичай systemd(або upstart) використовується для управління, які служби починаються, коли система завантажується. Ви можете спробувати використовувати подібну конфігурацію для цього:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

Або, якщо ви хочете запустити без -dпрапора:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

Змініть WorkingDirectoryпараметр за допомогою докерізованого контуру проекту. І дозвольте сервісу запускатися автоматично:

systemctl enable docker-compose-app

Чи є простий спосіб перевірити, чи працює він без перезавантаження малини?
dmigo

2
Це найелегантніша відповідь ІМО
кузин

2
@dmigo, systemctl start docker-compose-appі systemctl status docker-compose-appя вважаю, що ти шукаєш.
HectorJ

не працював для мене, коли я systemctl start docker-compose-appзіткнувся зіткнувся з цим:Job for docker-compose-app.service failed because the control process exited with error code. See "systemctl status docker-compose-app.service" and "journalctl -xe" for details
Бенямін Джафарі

1
@dmigo: тестовий запуск вашої служби з:, service docker-compose-app startстатус з service docker-compose-app status, зупинка зservice docker-compose-app stop
BarryPye

96

Ви повинні мати можливість додати:

restart: always 

до кожної служби, яку потрібно перезапустити у файлі docker-compose.yml


6
Майте на увазі, що вони повинні працювати під час перезавантаження, тому не зупиняйте їх вручну перед перезавантаженням.
Том

деякі сервіси, такі як Nginx, навіть не починаються з цієї опції.
Бенямін Джафарі

15
Це правильна відповідь на питання. Існує розроблений спосіб перезапустити контейнери, навіщо займатися cron та іншими способами винаходити колесо.
Taha Rehman Siddiqui

Це правильна відповідь. Коли ви почнете використовувати Kubernetes замість крона, ви будете щасливі, що використовували його.
pferrel

9
@TahaRehmanSiddiqui Зауважте, що restart: alwaysє деякі серйозні помилки: хост-кріплення не будуть додані, наприклад, при перезавантаженні. На мою думку, колесо краще винаходити, якщо наявне колесо квадратне.
okdewit

73

Якщо docker.serviceувімкнено під час запуску системи

$ sudo systemctl enable docker

і ваші послуги в вашому docker-compose.ymlмає

restart: always

усі сервіси запускаються при перезавантаженні системи, якщо ви запускаєте команду нижче лише один раз

docker-compose up -d

2
це має бути найелегантніше рішення
Карл Чеун

34

Я намагався restart: always, він працює в деяких контейнерах (наприклад, php-fpm), але я зіткнувся з проблемою, що деякі контейнери (наприклад, nginx) все ще не перезапускаються після перезавантаження.

Вирішили проблему.

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&

2
Чому голосування на цю відповідь? Чи відповідь не корисна? Це неправильно в будь-якому сенсі? Коментар буде корисним для того, щоб повідомити відповідача та інших людей, що не так.
Аюшя

5
Вам слід бути чутливим до голих снів, оскільки вони вводять недетерміновану поведінку: martinfowler.com/articles/…
giorgiosironi

@giorgiosironi сон в цьому випадку прекрасний. Пуск контейнера повинен так чи інакше вміти керувати недетермінованою поведінкою.
z0r

4
Це також вводить затримку до 30 секунд, яка може не знадобитися.
giorgiosironi

@ z0r сон не нормальний! Сон може "працювати", але будь-яка послідовність запуску повинна бути детермінованою. Служби Linux використовують залежності, щоб забезпечити доступність таких речей, як мережа тощо, перед їх запуском. Ви повинні зробити те саме.
colm.anseo

25

Використовуйте перезапуск: завжди у вашому докерному складеному файлі.

Docker-compose up -dзапустить контейнер із зображень знову. Використовуйте docker-compose startдля запуску зупинених контейнерів, він ніколи не запускає нові контейнери із зображень.

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

Також ви можете записати код у файл докера, щоб він був створений першим, якщо він має залежність від інших контейнерів.


1
Можливо, ви не хочете користуватися always, але можливо unless-stopped. Інші варіанти є on-failureі no. Це відомо як політика перезавантаження .
Павло

5

Як додаток до відповіді user39544's, ще один тип синтаксису crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d

Це працювало для мене в березні 2018 року на RPi3 з управлінням Raspian. Я побіг crontab -eяк користувач pi, з pi членом групового докера ...
Скотт Вейрс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.