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

Чтобы автозапуск контейнеров в момент запуска, я попытался добавить команду:

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

но после перезагрузки машины контейнеры не работают.

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

Ответ 1

Когда мы используем 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

Ответ 2

Вы можете добавить:

restart: always 

для каждой службы, которую вы хотите перезапустить в файле docker-compose.yml

Ответ 3

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

Решил проблему.

crontab -e

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

Ответ 4

Если ваш docker.service включен при запуске системы

$ sudo systemctl enable docker

и ваши услуги в вашем docker-compose.yml

restart: always

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

docker-compose up -d

Ответ 5

Используйте restart: всегда в вашем файле создания докера.

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

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

Также вы можете записать код в файле Docker, чтобы он сначала создавался, если он зависит от других контейнеров.

Ответ 6

В качестве дополнения к user39544 ответьте еще один тип синтаксиса для crontab -e:

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