Come eseguire docker-compose up -d all'avvio del sistema?


114

Per consentire l'avvio automatico dei contenitori al punto di avvio, ho provato ad aggiungere il comando:

cd directory_has_docker-compose.yml && docker-compose up -d in /etc/rc.local.

ma poi dopo aver riavviato la macchina, i contenitori non funzionano.

Come viene eseguito docker-compose up -dall'avvio del sistema?


3
utilizzare --restart alwaysor --restart unless-stoppedo in docker-compose.yml use restart: always-> Rif . Ma forse non ha funzionato su alcuni contenitori!
Benyamin Jafari

Risposte:


129

Quando usiamo crontabo il /etc/rc.localfile deprecato , abbiamo bisogno di un ritardo (ad esempio sleep 10, a seconda della macchina) per assicurarci che i servizi di sistema siano disponibili. Di solito, systemd(o upstart) viene utilizzato per gestire quali servizi vengono avviati all'avvio del sistema. Puoi provare a utilizzare la configurazione simile per questo:

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

Oppure, se vuoi correre senza -dbandiera:

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

Modificare il WorkingDirectoryparametro con il percorso del progetto dockerized. E abilita l'avvio automatico del servizio:

systemctl enable docker-compose-app

C'è un modo semplice per verificare se funziona senza riavviare il lampone?
dmigo

2
Questa è la risposta più elegante IMO
kuzyn

2
@dmigo systemctl start docker-compose-appe systemctl status docker-compose-appsono quello che stai cercando credo.
HectorJ

non ha funzionato per me, quando corro systemctl start docker-compose-appincontrato questo: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: prova l'avvio del tuo servizio con service docker-compose-app startservice docker-compose-app statusservice docker-compose-app stop
:,

96

Dovresti essere in grado di aggiungere:

restart: always 

a ogni servizio che desideri riavviare nel file docker-compose.yml


6
Tieni presente che devono essere in esecuzione quando si verifica un riavvio, quindi non interromperli manualmente prima del riavvio.
Tom,

alcuni servizi come Nginx non iniziano nemmeno con questa opzione.
Benyamin Jafari

15
Questa è la risposta corretta alla domanda. C'è un modo progettato per riavviare i contenitori, perché entrare in cron job e altri modi per reinventare la ruota.
Taha Rehman Siddiqui

Questa è la risposta esatta. Quando inizi a utilizzare Kubernetes invece di cron, sarai felice di averlo usato.
pferrel

9
@TahaRehmanSiddiqui Nota che restart: alwaysha alcuni bug seri: i montaggi host non verranno allegati al riavvio, ad esempio. Secondo me è meglio reinventare la ruota, se quella esistente è quadrata.
okdewit

73

Se docker.serviceabilitato all'avvio del sistema

$ sudo systemctl enable docker

e i tuoi servizi nel tuo docker-compose.ymlha

restart: always

tutti i servizi vengono eseguiti quando riavvii il sistema se esegui il comando sotto solo una volta

docker-compose up -d

2
questa dovrebbe essere la soluzione più elegante
Carl Cheung

34

Ho provato restart: always, funziona su alcuni contenitori (come php-fpm), ma ho riscontrato il problema che alcuni contenitori (come nginx) non si riavviano ancora dopo il riavvio.

Problema risolto.

crontab -e

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

2
Perché un voto negativo per questa risposta? La risposta non è utile? È sbagliato in qualche senso? Un commento sarebbe utile per far sapere a chi ha risposto e ad altri cosa c'è che non va.
Ayushya

5
Bisogna diffidare del sonno nudo poiché introducono comportamenti non deterministici: martinfowler.com/articles/…
giorgiosironi

@giorgiosironi il sonno va bene in questo caso. L'avvio del container deve essere in grado di gestire comunque un comportamento non deterministico.
z0r

4
Sta anche introducendo fino a 30 secondi di latenza che potrebbero non essere necessari.
giorgiosironi

@ z0r dormire non va bene! Il sonno può "funzionare" ma qualsiasi sequenza di avvio dovrebbe essere deterministica. I servizi Linux utilizzano le dipendenze per garantire che cose come la rete siano disponibili ecc. Prima di iniziare. Dovresti fare lo stesso.
colm.anseo

25

Usa il riavvio: sempre nel tuo file di composizione docker.

Docker-compose up -dlancerà nuovamente il contenitore dalle immagini. Utilizzare docker-compose startper avviare i contenitori arrestati, non avvia mai nuovi contenitori dalle immagini.

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

Inoltre puoi scrivere il codice nel file docker in modo che venga creato per primo, se ha la dipendenza di altri contenitori.


1
Potresti non volerlo usare always, ma forse unless-stopped. Altre opzioni sono on-failuree no. Questo è noto come criterio di riavvio .
Paul

5

In aggiunta alla user39544risposta di, un altro tipo di sintassi per crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d

Questo ha funzionato per me nel marzo 2018 su un RPi3 con Raspian. Ho eseguito crontab -ecome utente pi, con pi un membro del gruppo finestra mobile ...
Scott Veirs
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.