Docker-compose up -d sistem başlangıcında nasıl çalıştırılır?


115

Kapların başlangıç ​​noktasında otomatik olarak başlamasına izin vermek için şu komutu eklemeye çalıştım:

cd directory_has_docker-compose.yml && docker-compose up -d /etc/rc.local içinde.

ancak makineyi yeniden başlattıktan sonra kaplar çalışmıyor.

docker-compose up -dSistem başlangıcında nasıl çalışır ?


3
kullanmak --restart alwaysveya --restart unless-stoppedveya liman işçisi-compose.yml kullanımda restart: always-> Ref . Ama belki bazı kaplarda çalışmadı!
Benyamin Jafari

Yanıtlar:


133

Kullanımdan crontabkaldırılmış /etc/rc.localdosyayı kullandığımızda, sleep 10sistem hizmetlerinin kullanılabilir olduğundan emin olmak için bir gecikmeye (örneğin , makineye bağlı olarak) ihtiyacımız var. Genellikle systemd(veya upstart), sistem önyüklendiğinde hangi hizmetlerin başlayacağını yönetmek için kullanılır. Bunun için benzer yapılandırmayı deneyebilirsiniz:

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

Veya bayraksız koşmak istiyorsanız -d:

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

WorkingDirectoryParametreyi dockerize proje yolunuzla değiştirin . Ve hizmetin otomatik olarak başlamasını sağlayın:

systemctl enable docker-compose-app

Ahududuyu yeniden başlatmadan çalışıp çalışmadığını test etmenin basit bir yolu var mı?
dmigo

3
Bu en zarif cevap IMO
kuzyn

2
@dmigo systemctl start docker-compose-appve systemctl status docker-compose-apparadığınız şey bence.
HectorJ

Ben çalıştırdığınızda, benim için çalışmamış systemctl start docker-compose-app: Bu karşılaşılanJob 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: hizmetinizin başlangıcını test edin:, service docker-compose-app startstatus with service docker-compose-app status, stop withservice docker-compose-app stop
BarryPye

96

Ekleyebilmeniz gerekir:

restart: always 

docker-compose.yml dosyasında yeniden başlatmak istediğiniz her hizmete


6
Bir yeniden başlatma gerçekleştiğinde çalışıyor olmaları gerektiğini unutmayın, bu nedenle yeniden başlatmadan önce onları manuel olarak durdurmayın.
Tom

Nginx gibi bazı hizmetler bu seçenekle bile başlamıyor.
Benyamin Jafari

15
Sorunun doğru cevabı bu. Kapları yeniden başlatmanın tasarlanmış bir yolu var, neden cron işlerine girelim ve tekerleği yeniden icat etmenin başka yolları var.
Taha Rehman Siddiqui

Bu doğru cevap. Cron yerine Kubernetes kullanmaya başladığınızda, kullandığınız için mutlu olacaksınız.
pferrel

9
@TahaRehmanSiddiqui restart: alwaysBazı ciddi hatalara dikkat edin: örneğin yeniden başlatma sırasında ana bilgisayar bağlantıları eklenmeyecektir . Bence mevcut tekerlek kare ise tekerleği yeniden icat etmek daha iyidir.
okdewit

73

Eğer senin docker.serviceSistem açılışında etkin

$ sudo systemctl enable docker

ve senin içinde hizmetler docker-compose.ymlvardır

restart: always

Aşağıdaki komutu yalnızca bir kez çalıştırırsanız, sisteminizi yeniden başlattığınızda tüm hizmetler çalışır.

docker-compose up -d

2
bu en zarif çözüm olmalı
Carl Cheung

34

Denedim restart: always, bazı kapsayıcılarda çalışıyor (php-fpm gibi), ancak bazı kapsayıcıların (nginx gibi) yeniden başlatıldıktan sonra hala yeniden başlamaması sorunuyla karşılaştım.

Sorunu çözdüm.

crontab -e

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

2
Neden bu cevap için olumsuz oy veriliyor? Cevap yararlı değil mi? Herhangi bir anlamda yanlış mı? Cevap verene ve diğerlerine neyin yanlış olduğunu bildirmek için bir yorum yararlı olacaktır.
Ayushya

5
Belirleyici olmayan davranışlara yol açtıkları için çıplak uykudan
şüphelenmelisiniz

@giorgiosironi bu durumda uyku iyidir. Konteyner başlangıcı yine de belirleyici olmayan davranışları idare edebilmelidir.
z0r

4
Ayrıca, ihtiyaç duyulmayabilecek 30 saniyeye kadar gecikme sunuyor.
giorgiosironi

@ z0r uyku iyi değil! Uyku "çalışabilir" ancak herhangi bir başlatma sırası belirleyici olmalıdır. Linux hizmetleri, ağ gibi şeylerin başlamadan önce kullanılabilir olmasını sağlamak için bağımlılıkları kullanır. Aynısını yapmalısın.
colm.anseo

25

Kullanım yeniden başlatın: hep senin liman işçisi oluşturma dosyasında.

Docker-compose up -dkapsayıcıyı görüntülerden yeniden başlatacak. docker-compose startDurdurulmuş kapsayıcıları başlatmak için kullanın , yeni kapsayıcıları asla görüntülerden başlatmaz.

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

Ayrıca, diğer kapsayıcıların bağımlılığına sahipse, kodu docker dosyasına yazarak önce oluşturulmasını sağlayabilirsiniz.


1
Kullanmak istemeyebilirsin alwaysama belki unless-stopped. Diğer seçenekler on-failureve no. Bu, yeniden başlatma politikası olarak bilinir .
Paul

5

Cevabına ek olarak user39544, aşağıdakiler için bir tür daha sözdizimi daha crontab -e:

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

Bu benim için Mar 2018'de Raspian çalıştıran bir RPi3'te çalıştı. crontab -ePi grubu docker'ın bir üyesi ile pi kullanıcı olarak koştum ...
Scott Veirs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.