Pour permettre aux conteneurs de démarrer automatiquement au point de démarrage, j'ai essayé d'ajouter la commande:
cd directory_has_docker-compose.yml && docker-compose up -d
dans /etc/rc.local.
mais après le redémarrage de la machine, les conteneurs ne fonctionnent pas.
Comment exécuter docker-compose up -d
au démarrage du système?
Lorsque nous utilisons crontab
ou le fichier obsolète /etc/rc.local
, nous avons besoin d’un délai (par exemple, sleep 10
, en fonction de la machine) pour nous assurer que les services système sont disponibles. En général, systemd
(ou upstart
) est utilisé pour gérer les services qui démarrent lorsque le système démarre. Vous pouvez essayer d'utiliser une configuration similaire pour cela:
# /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
Ou, si vous souhaitez exécuter sans l'indicateur -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
Modifiez le paramètre WorkingDirectory
avec votre chemin de projet dockerisé. Et activez le service pour qu'il démarre automatiquement:
systemctl enable docker-compose-app
Vous devriez pouvoir ajouter:
restart: always
à chaque service que vous souhaitez redémarrer dans le fichier docker-compose.yml
J'ai essayé restart: always
, cela fonctionne sur certains conteneurs (comme php-fpm), mais j'ai rencontré le problème que certains conteneurs (comme nginx) ne redémarre toujours pas après le redémarrage.
Résolu le problème.
crontab -e
@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&
Si votre docker.service
est activé au démarrage du système
$ Sudo systemctl enable docker
et vos services dans votre docker-compose.yml
a
restart: always
tous les services sont exécutés lorsque vous redémarrez votre système si vous exécutez la commande ci-dessous une seule fois
docker-compose up -d
Utilisez redémarrer: toujours dans le fichier de composition du menu fixe. Docker-compos up up -d lancera à nouveau le conteneur à partir d'images. Utilisez docker-compose start pour démarrer les conteneurs arrêtés. Il ne lance jamais de nouveaux conteneurs à partir d'images.
nginx:
restart: always
image: nginx
ports:
- "80:80"
- "443:443" links:
- other_container:other_container
Vous pouvez aussi écrire le code dans le fichier fixe pour qu'il soit créé en premier, s'il a la dépendance sur un autre conteneur.
En plus de la réponse de user39544
, un autre type de syntaxe pour crontab -e
:
@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d