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

115

Pour laisser les conteneurs 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 avoir redémarré la machine, les conteneurs ne fonctionnent pas.

Comment fonctionner docker-compose up -dau démarrage du système?

user39544
la source
3
utilisez --restart alwaysou --restart unless-stoppedou dans docker-compose.yml use restart: always-> Ref . Mais peut-être pas travaillé sur certains conteneurs!
Benyamin Jafari

Réponses:

133

Lorsque nous utilisons crontabou le /etc/rc.localfichier obsolète , nous avons besoin d'un délai (par exemple sleep 10, selon la machine) pour nous assurer que les services 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 la 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 courir sans le -ddrapeau:

# /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 WorkingDirectoryparamètre avec le chemin de votre projet dockerisé. Et activez le service pour démarrer automatiquement:

systemctl enable docker-compose-app
Oleg Belostotsky
la source
Existe-t-il un moyen simple de tester si cela fonctionne sans redémarrer Raspberry?
dmigo
3
C'est la réponse la plus élégante IMO
kuzyn
2
@dmigo systemctl start docker-compose-appet systemctl status docker-compose-appc'est ce que vous cherchez je pense.
HectorJ
n'a pas fonctionné pour moi, quand je cours systemctl start docker-compose-apprencontré avec ceci: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
Benyamin Jafari
1
@dmigo: testez le démarrage de votre service avec service docker-compose-app startservice docker-compose-app statusservice docker-compose-app stop
:,
96

Vous devriez pouvoir ajouter:

restart: always 

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

MaxiReglisse
la source
6
Gardez à l'esprit qu'ils doivent être en cours d'exécution lors d'un redémarrage, alors ne les arrêtez pas manuellement avant le redémarrage.
Tom
certains services tels que Nginx ne démarre même pas avec cette option.
Benyamin Jafari
15
C'est la bonne réponse à la question. Il existe un moyen conçu pour redémarrer les conteneurs, pourquoi se lancer dans des tâches cron et d'autres moyens de réinventer la roue.
Taha Rehman Siddiqui
C'est la bonne réponse. Lorsque vous commencez à utiliser Kubernetes au lieu de cron, vous serez heureux de l'avoir utilisé.
pferrel
9
@TahaRehmanSiddiqui Remarque qui restart: alwaysa quelques bugs sérieux: les montages d'hôte ne seront pas attachés au redémarrage par exemple. À mon avis, il vaut mieux réinventer la roue, si la roue existante est carrée.
okdewit
73

Si votre docker.serviceactivé au démarrage du système

$ sudo systemctl enable docker

et vos services dans votre docker-compose.ymla

restart: always

tous les services s'exécutent lorsque vous redémarrez votre système si vous exécutez la commande ci-dessous une seule fois

docker-compose up -d
masoud vatandoost
la source
2
cela devrait être la solution la plus élégante
Carl Cheung
34

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émarrent 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 )&
user39544
la source
2
Pourquoi un vote négatif pour cette réponse? La réponse n'est-elle pas utile? Est-ce mal en quelque sorte? Un commentaire serait utile pour faire savoir au répondant et aux autres ce qui ne va pas.
Ayushya
5
Vous devriez vous méfier des sommeil nus car ils introduisent un comportement non déterministe: martinfowler.com/articles
...
@giorgiosironi sleep est très bien dans ce cas. Le démarrage du conteneur doit être capable de gérer un comportement non déterministe de toute façon.
z0r
4
Cela introduit également jusqu'à 30 secondes de latence qui peuvent ne pas être nécessaires.
giorgiosironi
@ z0r sommeil ne va pas! Le sommeil peut "fonctionner" mais toute séquence de démarrage doit être déterministe. Les services Linux utilisent des dépendances pour s'assurer que des éléments tels que le réseau sont disponibles, etc. avant de démarrer. Tu devrais faire pareil.
colm.anseo
25

Utilisez le redémarrage: toujours dans votre fichier de composition docker

Docker-compose up -dlancera à nouveau le conteneur à partir d'images. Utilisé docker-compose startpour 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.

Vaseem007
la source
1
Vous ne voudrez peut-être pas utiliser always, mais peut-être unless-stopped. D'autres options sont on-failureet no. C'est ce qu'on appelle une politique de redémarrage .
Paul
5

En complément de user39544la réponse de, 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
TitanFighter
la source
Cela a fonctionné pour moi en mars 2018 sur un RPi3 exécutant Raspian. J'ai couru en crontab -etant qu'utilisateur pi, avec pi un membre du groupe docker ...
Scott Veirs