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.