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?


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

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


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

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 )&

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.