Как запустить 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