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.