241 votes

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

Pour que les conteneurs démarrent automatiquement au moment du 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 avoir redémarré la machine, les conteneurs ne fonctionnent pas.

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

7 votes

Utiliser --restart always o --restart unless-stopped ou dans docker-compose.yml utiliser restart: always --> Réf. . Mais peut-être pas sur certains conteneurs !

269voto

Oleg Belostotsky Points 2582

Lorsque nous utilisons crontab ou l'option dépréciée /etc/rc.local nous avons besoin d'un délai (par ex. sleep 10 selon la machine) pour s'assurer que les services du système sont disponibles. Habituellement, systemd (ou upstart ) est utilisé pour gérer les services qui démarrent au démarrage du système. 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 voulez fonctionner sans le -d drapeau :

# /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

Changez le WorkingDirectory avec le chemin de votre projet dockerisé. Et activez le service pour qu'il démarre automatiquement :

systemctl enable docker-compose-app

2 votes

Existe-t-il un moyen simple de tester si cela fonctionne sans redémarrer raspberry ?

14 votes

C'est la réponse la plus élégante, selon moi.

6 votes

@dmigo systemctl start docker-compose-app y systemctl status docker-compose-app sont ce que vous recherchez je pense.

231voto

MaxiReglisse Points 318

Vous devriez être en mesure d'ajouter :

restart: always 

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

Voir : https://github.com/compose-spec/compose-spec/blob/master/spec.md#restart

19 votes

Gardez à l'esprit qu'ils doivent être en cours d'exécution lorsqu'un redémarrage se produit, donc ne les arrêtez pas manuellement avant le redémarrage.

1 votes

Certains services tels que Nginx ne démarrent pas avec cette option même.

33 votes

C'est la bonne réponse à la question. Il existe un moyen conçu pour redémarrer les conteneurs, pourquoi se lancer dans les tâches cron et autres façons de réinventer la roue.

226voto

masoud vatandoost Points 103

Si votre docker.service 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

8 votes

Cette solution devrait être la plus élégante

2 votes

Pourquoi "restart : always" et pas "restart : unless-stopped" ? Les deux devraient faire le travail, je dirais

1 votes

@rastov les deux sont similaires mais dans unless-stopped lorsque le conteneur est arrêté (manuellement ou autrement), il n'est pas redémarré même après le redémarrage du démon Docker.

46voto

Vaseem007 Points 780

Utilice redémarrage : toujours dans votre fichier docker compose.

Docker-compose up -d lancera à nouveau le conteneur à partir des 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 également écrire le code dans le fichier docker afin qu'il soit créé en premier, s'il a la dépendance d'autres conteneurs.

7 votes

Vous ne voudrez peut-être pas utiliser always mais peut-être unless-stopped . Les autres options sont on-failure y no . C'est ce qu'on appelle un politique de redémarrage .

0 votes

L'ajout de cette ligne devrait suffire ? Existe-t-il un tutoriel sur la façon d'activer cette solution complète ? Merci !

45voto

user39544 Points 649

J'ai essayé restart: always Cela fonctionne pour 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.

J'ai résolu le problème.

crontab -e

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

2 votes

Pourquoi un downvote pour cette réponse ? La réponse n'est-elle pas utile ? Est-elle fausse dans un sens ou dans un autre ? Un commentaire serait utile pour faire savoir à la personne qui a répondu et aux autres ce qui ne va pas.

11 votes

Vous devez vous méfier des sleeps nus car ils introduisent un comportement non déterministe : martinfowler.com/articles/

0 votes

@giorgiosironi le sommeil est bien dans ce cas. Le démarrage du conteneur doit être capable de gérer un comportement non déterministe de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X