Ответы:
Когда мы используем 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
systemctl start docker-compose-appи systemctl status docker-compose-appя думаю, это то, что вы ищете.
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
service docker-compose-app startстатус с service docker-compose-app status, остановка сservice docker-compose-app stop
Вы должны иметь возможность добавить:
restart: always
для каждой службы, которую вы хотите перезапустить, в файле docker-compose.yml
restart: alwaysесть несколько серьезных ошибок: например, при перезагрузке не будут прикреплены крепления хоста. На мой взгляд, велосипед лучше изобретать, если имеющееся колесо квадратное.
Если ваш docker.serviceвключен при запуске системы
$ sudo systemctl enable docker
и ваши услуги в вашем docker-compose.ymlесть
restart: always
все службы запускаются при перезагрузке системы, если вы запустите команду ниже только один раз
docker-compose up -d
Я пробовал restart: always, он работает в некоторых контейнерах (например, php-fpm), но я столкнулся с проблемой, что некоторые контейнеры (например, nginx) все еще не перезагружаются после перезагрузки.
Решил проблему.
crontab -e
@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&
Используйте перезапуск: всегда в вашем файле компоновки докеров.
Docker-compose up -dснова запустит контейнер из образов. Используется docker-compose startдля запуска остановленных контейнеров, никогда не запускает новые контейнеры из образов.
nginx:
restart: always
image: nginx
ports:
- "80:80"
- "443:443" links:
- other_container:other_container
Также вы можете написать код в файле докеров, чтобы он создавался первым, если он зависит от других контейнеров.
always, но возможно unless-stopped. Другие варианты - on-failureи no. Это известно как политика перезапуска .
В дополнение к user39544ответу еще один тип синтаксиса для crontab -e:
@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d
crontab -eкак пользователь pi, а pi был членом группы docker ...
--restart alwaysили--restart unless-stoppedили в docker-compose.yml используйтеrestart: always-> Ссылка . Но, возможно, не сработало на некоторых контейнерах!