Wie starte ich Docker-Compose Up-D beim Systemstart?

113

Damit die Container beim Start automatisch gestartet werden, habe ich versucht, den folgenden Befehl hinzuzufügen:

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

Aber nachdem ich den Computer neu gestartet habe, funktionieren die Container nicht.

Wie läuft es docker-compose up -dbeim Systemstart?

user39544
quelle
3
benutze --restart alwaysoder --restart unless-stoppedoder in docker-compose.yml benutze restart: always-> Ref . Aber vielleicht nicht an einigen Containern gearbeitet!
Benyamin Jafari

Antworten:

129

Wenn wir crontabdie veraltete /etc/rc.localDatei verwenden oder verwenden, benötigen wir eine Verzögerung (z. B. sleep 10abhängig vom Computer), um sicherzustellen, dass Systemdienste verfügbar sind. Normalerweise wird systemd(oder upstart) verwendet, um zu verwalten, welche Dienste beim Systemstart gestartet werden. Sie können versuchen, die ähnliche Konfiguration dafür zu verwenden:

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

Oder wenn Sie ohne -dFlagge laufen möchten :

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

Ändern Sie den WorkingDirectoryParameter mit Ihrem Docker-Projektpfad. Und aktivieren Sie den Dienst automatisch:

systemctl enable docker-compose-app
Oleg Belostotsky
quelle
Gibt es eine einfache Möglichkeit zu testen, ob es funktioniert, ohne Himbeere neu zu starten?
Dmigo
2
Dies ist die eleganteste Antwort IMO
Kuzyn
2
@dmigo systemctl start docker-compose-appund systemctl status docker-compose-appsind, was Sie suchen, denke ich.
HectorJ
nicht für mich gearbeitet, als ich darauf systemctl start docker-compose-appgestoßen bin :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: Teststart Ihres Dienstes mit : service docker-compose-app start, Status mit service docker-compose-app status, Stopp mitservice docker-compose-app stop
BarryPye
95

Sie sollten hinzufügen können:

restart: always 

zu jedem Dienst, den Sie in der Datei docker-compose.yml neu starten möchten

MaxiReglisse
quelle
6
Beachten Sie, dass sie bei einem Neustart ausgeführt werden müssen. Stoppen Sie sie daher nicht manuell vor dem Neustart.
Tom
Einige Dienste wie Nginx beginnen nicht einmal mit dieser Option.
Benyamin Jafari
15
Dies ist die richtige Antwort auf die Frage. Es gibt eine Möglichkeit, Container neu zu starten, warum Sie Cron-Jobs ausführen und das Rad auf andere Weise neu erfinden können.
Taha Rehman Siddiqui
Das ist die richtige Antwort. Wenn Sie Kubernetes anstelle von Cron verwenden, werden Sie froh sein, dass Sie es verwendet haben.
Pferrel
9
@TahaRehmanSiddiqui Beachten Sie, dass restart: alwayses einige schwerwiegende Fehler gibt: Host-Mounts werden beispielsweise beim Neustart nicht angehängt. Meiner Meinung nach ist es besser, das Rad neu zu erfinden, wenn das vorhandene Rad quadratisch ist.
Okdewit
73

Wenn Sie docker.servicebeim Systemstart aktiviert sind

$ sudo systemctl enable docker

und Ihre Dienste in Ihrem docker-compose.ymlhat

restart: always

Alle Dienste werden beim Neustart Ihres Systems ausgeführt, wenn Sie den folgenden Befehl nur einmal ausführen

docker-compose up -d
masoud vatandoost
quelle
2
Dies sollte die eleganteste Lösung sein
Carl Cheung
34

Ich habe versucht restart: always, es funktioniert bei einigen Containern (wie php-fpm), aber ich hatte das Problem, dass einige Container (wie nginx) nach dem Neustart immer noch nicht neu gestartet werden.

Problem gelöst.

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&
user39544
quelle
2
Warum eine Ablehnung für diese Antwort? Ist die Antwort nicht nützlich? Ist es in irgendeiner Weise falsch? Ein Kommentar wäre hilfreich, um den Antwortenden und andere wissen zu lassen, was falsch ist.
Ayushya
5
Sie sollten den Verdacht haben, nackt zu schlafen, da dies zu nicht deterministischem Verhalten führt: martinfowler.com/articles/…
giorgiosironi
@giorgiosironi Schlaf ist in diesem Fall in Ordnung. Der Start des Containers muss ohnehin mit nicht deterministischem Verhalten umgehen können.
z0r
4
Außerdem werden bis zu 30 Sekunden Latenz eingeführt, die möglicherweise nicht benötigt werden.
Giorgiosironi
@ z0r Schlaf ist nicht gut! Der Schlaf kann "funktionieren", aber jede Startsequenz sollte deterministisch sein. Linux-Dienste verwenden Abhängigkeiten, um sicherzustellen, dass Dinge wie das Netzwerk usw. verfügbar sind, bevor sie gestartet werden. Do solltest das auch machen.
colm.anseo
25

Verwenden Sie restart: immer in Ihrer Docker-Erstellungsdatei.

Docker-compose up -dstartet den Container erneut aus Bildern. Verwenden Sie docker-compose startdiese Option , um die gestoppten Container zu starten. Es werden niemals neue Container aus Images gestartet.

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

Sie können den Code auch in die Docker-Datei schreiben, sodass er zuerst erstellt wird, wenn er von anderen Containern abhängig ist.

Vaseem007
quelle
1
Sie möchten vielleicht nicht verwenden always, aber vielleicht unless-stopped. Andere Optionen sind on-failureund no. Dies wird als Neustartrichtlinie bezeichnet .
Paul
5

Als Ergänzung zu user39544's Antwort eine weitere Art von Syntax für crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d
TitanFighter
quelle
Dies funktionierte für mich im März 2018 auf einem RPi3 mit Raspian. Ich lief crontab -eals Benutzer pi, mit pi ein Mitglied der Gruppe Docker ...
Scott Veirs