Jak uruchomić docker-compose up -d podczas uruchamiania systemu?

115

Aby umożliwić automatyczne uruchamianie kontenerów w momencie uruchamiania, próbowałem dodać polecenie:

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

ale po ponownym uruchomieniu komputera kontenery nie działają.

Jak działa docker-compose up -dpodczas uruchamiania systemu?

user39544
źródło
3
użyj --restart alwayslub --restart unless-stoppedlub w docker-compose.yml use restart: always-> Ref . Ale może nie działało na niektórych kontenerach!
Benyamin Jafari

Odpowiedzi:

133

Kiedy używamy crontablub przestarzałego /etc/rc.localpliku, potrzebujemy opóźnienia (np. W sleep 10zależności od komputera), aby upewnić się, że usługi systemowe są dostępne. Zwykle systemd(lub upstart) służy do zarządzania usługami uruchamianymi podczas uruchamiania systemu. Możesz spróbować użyć podobnej konfiguracji do tego:

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

Lub, jeśli chcesz biegać bez -dflagi:

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

Zmień WorkingDirectoryparametr za pomocą zadokowanej ścieżki projektu. I włącz usługę, aby uruchamiała się automatycznie:

systemctl enable docker-compose-app
Oleg Belostotsky
źródło
Czy istnieje prosty sposób na sprawdzenie, czy działa bez ponownego uruchamiania maliny?
dmigo,
3
To najbardziej elegancka odpowiedź IMO
kuzyn
2
@dmigo systemctl start docker-compose-appi myślę, że systemctl status docker-compose-appsą tym, czego szukasz.
HectorJ
nie zadziałało dla mnie, kiedy biegam systemctl start docker-compose-appnapotkałem z tym: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: testowe uruchomienie usługi z service docker-compose-app startservice docker-compose-app statusservice docker-compose-app stop
:,
96

Powinieneś móc dodać:

restart: always 

do każdej usługi, którą chcesz ponownie uruchomić w pliku docker-compose.yml

MaxiReglisse
źródło
6
Pamiętaj, że muszą być uruchomione po ponownym uruchomieniu, więc nie zatrzymuj ich ręcznie przed ponownym uruchomieniem.
Tom
niektóre usługi, takie jak Nginx, nie uruchamiają się nawet z tą opcją.
Benyamin Jafari
15
To jest właściwa odpowiedź na pytanie. Istnieje zaprojektowany sposób ponownego uruchamiania kontenerów, po co angażować się w zadania cron i inne sposoby na odkrywanie koła na nowo.
Taha Rehman Siddiqui
To jest właściwa odpowiedź. Kiedy zaczniesz używać Kubernetes zamiast crona, będziesz szczęśliwy, że go użyłeś.
pferrel
9
@TahaRehmanSiddiqui Zauważ, że restart: alwaysma kilka poważnych błędów: na przykład punkty montowania hosta nie zostaną dołączone przy ponownym uruchomieniu. Moim zdaniem lepiej wymyślić koło na nowo, jeśli istniejące koło jest kwadratowe.
okdewit
73

Jeśli masz docker.servicewłączone przy starcie systemu

$ sudo systemctl enable docker

i twoje usługi w swoich docker-compose.ymlzasobach

restart: always

wszystkie usługi działają po ponownym uruchomieniu systemu, jeśli uruchomisz poniższe polecenie tylko raz

docker-compose up -d
masoud vatandoost
źródło
2
to powinno być najbardziej eleganckie rozwiązanie
Carl Cheung
34

Próbowałem restart: always, działa na niektórych kontenerach (takich jak php-fpm), ale napotkałem problem polegający na tym, że niektóre kontenery (takie jak nginx) nadal nie uruchamiają się ponownie po ponownym uruchomieniu.

Rozwiązać problem.

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&
user39544
źródło
2
Po co głosować przeciw tej odpowiedzi? Czy odpowiedź nie jest przydatna? Czy to w jakimś sensie złe? Komentarz byłby przydatny, aby osoba odpowiadająca i inni wiedzieli, co jest nie tak.
Ayushya
5
Powinieneś być podejrzliwy wobec nagich snów, ponieważ wprowadzają one niedeterministyczne zachowania: martinfowler.com/articles/ ...
giorgiosironi
W tym przypadku sen @giorgiosironi jest w porządku. Uruchomienie kontenera i tak musi być w stanie obsłużyć niedeterministyczne zachowanie.
z0r
4
Wprowadza również opóźnienie do 30 sekund, które może nie być potrzebne.
giorgiosironi
@ Z0r sen nie jest w porządku! Sen może „działać”, ale każda sekwencja startowa powinna być deterministyczna. Usługi Linuksa używają zależności, aby zapewnić dostępność rzeczy, takich jak sieć itp., Zanim zaczną. Powinieneś zrobić to samo.
colm.anseo
25

Użyj ponownego uruchomienia: zawsze w pliku redagowania Dockera.

Docker-compose up -dponownie uruchomi kontener z obrazów. Służy docker-compose startdo uruchamiania zatrzymanych kontenerów, nigdy nie uruchamia nowych kontenerów z obrazów.

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

Możesz również zapisać kod w pliku Dockera, aby został utworzony jako pierwszy, jeśli ma zależności od innych kontenerów.

Wazon007
źródło
1
Możesz nie chcieć używać always, ale może unless-stopped. Inne opcje to on-failurei no. Jest to znane jako zasada ponownego uruchamiania .
Paweł
5

Jako dodatek do user39544odpowiedzi, jeszcze jeden typ składni dla crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d
TitanFighter
źródło
To zadziałało dla mnie w marcu 2018 na RPi3 z Raspianem. Pobiegłem crontab -ejako użytkownik pi, z pi członkiem grupy
docker