web-dev-qa-db-fra.com

Comment exécuter docker-compose up -d au démarrage du système?

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?

68
user39544

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
84
Oleg Belostotsky

Vous devriez pouvoir ajouter:

restart: always 

à chaque service que vous souhaitez redémarrer dans le fichier docker-compose.yml

52
MaxiReglisse

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 )&
30
user39544

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
26
masoud vatandoost

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.

11
Vaseem007

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
4
TitanFighter