Docker-compose ile tek bir kapsayıcı nasıl yeniden başlatılır


333

docker-compose.yml4 kapsayıcı içeren bir dosya var: redis, postgres, api, worker

İşçinin gelişimi sırasında, değişiklikleri uygulamak için genellikle onu yeniden başlatmam gerekir. workerDiğer kapları yeniden başlatmadan bir kapsayıcıyı (ör. ) Yeniden başlatmanın iyi bir yolu var mı ?


2
docker-compose -f docker-compose.yml yeniden başlatma işçisi
Jinna Balu

Yanıtlar:


398

Çok basit: Şu komutu kullanın:

docker-compose restart worker

Konteyneri öldürmeden önce durma zamanını ayarlayabilirsiniz (saniye olarak)

docker-compose restart -t 30 worker

Bunun kapsayıcıyı yeniden oluşturmadan yeniden başlatacağını unutmayın. Değişikliklerinizi uygulamak ve ardından yeniden başlatmak istiyorsanız, diğer yanıtlara bir göz atın.


3
benim için işe yaradı, ancak burada izin verilirse genel bir soru: 'yeniden başlat' bağlı kapsayıcılarla ilgileniyor ve / etc / hosts'i güncelleştiriyor mu veya 'yeniden başlatma' hiçbir IP'yi değiştirmiyor mu?
michabbb

Kaplar ada göre bağlanır ve genellikle endişelenmeniz gereken tek IP harici docker ana bilgisayar IP'sidir (genellikle 192.168.99.100). Bazı sorunların olabileceği yerler, diğer kapların bağlı olduğu bir veritabanı kapsayıcısını yeniden başlatmanızdır. Bağımlı kapların yeniden bağlanabilecek kadar esnek olması gerekir.
Ryan Kimber

20
OP "değişiklikleri uygulamak için yeniden başlatması" gerektiğini belirtir. Dokümanlara göre docker-compose restartkomutlar herhangi bir değişiklik UYGULAMAZ. " docker-compose.ymlYapılandırmanızda değişiklik yaparsanız, bu komut çalıştırıldıktan sonra bu değişiklikler yansıtılmaz." Bu nedenle kullanın docker-compose up -d --build. docs.docker.com/compose/reference/restart
featherbelly

5
nb, işçi yaml dosyasındaki hizmete verilen addır ve çalışırken gördüğünüz herhangi bir şey değildirdocker ps -a
worc

2
Bu diğer cevap çok daha iyidir stackoverflow.com/a/39501539/292408 , çünkü restartzaten çalıştırmış olsanız bile değişiklikler uygulanmaz docker-compose build <container name>ve bu çalışmayan / yanlış bir cevaptır.
Elijah Lynn

170

Tek bir düğümü yeniden başlatmanın diğer yanıtları hedeftedir docker-compose restart worker. Bu, kapsayıcıyı geri döndürür, ancak ayrı olarak yeniden oluşturmuş olsanız bile herhangi bir değişiklik içermez. Manuel olabilir stop, rm, createve startfakat daha kolay çok yöntem vardır.

Kodunuzu güncellediyseniz, derlemeyi şu şekilde tek bir adımda yapabilir ve yeniden yükleyebilirsiniz:

docker-compose up --detach --build

Bu, ilk olarak görüntülerinizi değiştirilen herhangi bir koddan yeniden oluşturacaktır; bu, önbellek yeniden kullanıldığından beri değişiklik yoksa hızlıdır. Ve sonra sadece değiştirilen kapların yerini alır. İndirdiğiniz görüntüler eskiyse, yukarıdaki komutun önüne geçebilirsiniz:

docker-compose pull

Önce değiştirilen görüntüleri indirmek için ( upyukarıdaki gibi bir komut çalışana kadar kaplar yeniden başlatılmaz ). İlk duruşun yapılması gereksizdir.

Ve bunu tek bir hizmet için yapmak için, belirtmek istediğiniz hizmetlerle yukarı veya çekme komutunu izleyin, örn:

docker-compose up --detach --build worker

İlk seçeneğin kısa bir örneği olan Dockerfile, kodun sıkça değişen bölümlerini sonuna yakın tutacak şekilde yapılandırılmıştır. Aslında, pip installbu dosya nadiren değiştiği için gereksinimler ayrı ayrı çekilir . Ve nginx ve redis kapları güncel olduğundan yeniden başlatılmadılar. Tüm süreç için toplam süre 6 saniyenin altındaydı:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s

Bu ilginç, ancak -no-cacheseçenekle birlikte kullanılabilir mi? Diyelim ki bir şey ekledim package.jsonve yeniden ihtiyacım var RUN npm installama Dockerfilekendisi değişmedi
Augustin Riedinger

2
@augustinriedinger Girdi dosyanız değiştirilirse ve bunu bir COPYkomutla eklerseniz , önbellek otomatik olarak bozulur .
BMitch

1
@augustinriedinger teşekkürler. Mobilim, bu yüzden bağlantılı soruları göremiyorum. COPYSorunuzdaki adımlardan Dockerfile dosyasında zaten bir komut bulunmalıdır. git pullPackage.json dosyasını güncelleyecektir ve liman işçilerinin farklı bir dosyada kopya gördüğünde inşa önbellek kıracak.
BMitch

1
Teşekkürler bu davranış hakkında bilmiyordum! Onun ADDyerine kullanıyordum COPYama görünüşe göre ikincisi en iyi uygulama bu yüzden bunun için gideceğim!
Augustin Riedinger

1
@augustinriedinger , önbellek büstü ile ADDaynı sonuca sahip olacak COPY, ancak (en iyi uygulamalar bağlantısında önerildiği gibi) çoğu ekstra yeteneklere ihtiyaç duymuyor, bu yüzden bahsetmekten bile rahatsız etmiyorum.
BMitch

28

Burada değişikliklerle bir hizmeti yeniden başlatmak için gerçekleştirdiğim adımlar şunlardır:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker

10
Bir derleme ile uygulamak için değişikliklere ihtiyacınız varsa, kolayca bir yapabilirsiniz docker-compose up -d --buildve her şeyi yeniden oluşturacak ve değiştirilen kapları yeniden başlatacaktır. Durma süresine ve ayrı oluşturma ve başlatma komutlarına sahip ilk önce durdurmaya gerek yoktur.
BMitch

4
Evet, tüm hizmetleri yeniden başlatmak istiyorsanız, ancak OP yalnızca tek bir hizmeti yeniden başlatmak ve diğerlerini yeniden başlatmak istemiyorsa
Jeff

3
Örnekte gönderdiğim yanıtı görün, upyalnızca değiştirilen ve bu nedenle yeniden başlatılması gereken kapsayıcıyı yeniden oluşturacak.
BMitch

18

Aşağıdaki komut

docker-compose restart worker

sadece kabı DURDUR ve BAŞLATACAK. örneğin, docker-compose.xml dosyasından herhangi bir değişiklik yüklemeden

STOP bilgisayardaki hazırda bekletme moduna benzer. Bu nedenle, durdur / başlat yapılandırma dosyasında yapılan değişiklikleri aramaz. Kap reçetesinden (docker-compose.xml) yeniden yüklemek için kabı kaldırmamız ve oluşturmamız gerekiyor (PC'yi yeniden başlatmak için benzer benzetme)

Yani komutlar aşağıdaki gibi olacak

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation

+1, çok teşekkürler! İçin rmhat seçeneği -fkullanışlı (sormadan) ve mevcut liman işçisi geliyor createve startbirleştirilir olarak up(böylece toplamda biz 3 komutları değil 4 var) ve için upseçenek -d(yürütme arka planda) yararlıdır.
astrowalker

10

Docker-compose dosyasıyla Hizmeti Yeniden Başlat

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

Örnek Olay No. 1'i kullanın: COMPOSE_FILE_NAME ise docker-compose.ymlve hizmet çalışıyorsa

docker-compose restart worker

Örnek 2'yi kullanın: Dosya adı sample.ymlve hizmet çalışansa

docker-compose -f sample.yml restart worker

Varsayılan olarak, docker-compose komutu docker-compose.ymlçalıştırırsak arar, aksi takdirdedocker-compose-f [FILE_NAME].yml


7

Basit 'docker' komutu 'worker' konteyneri hakkında hiçbir şey bilmez. Bu komutu kullan

docker-compose -f docker-compose.yml restart worker


4
çalışmıyor - coker-compose.yml dosyasında yeni değişiklikler yeniden başlatıldığında uygulanmadı
jlee

3

Kapsayıcıyı yeniden başlat

Kapsayıcınızı yeniden başlatmak istiyorsanız:

docker-compose restart servicename

Bu komutu "komuta adıyla yeniden başlat" komutunu düşünün docker restart.

Uyarılar:

  1. ENV değişkenlerini değiştirdiyseniz bunlar kapta güncellenmez. Durdurup tekrar başlamanız gerekiyor. Veya, tek bir komut kullanarak docker-compose updeğişiklikleri algılar ve kapsayıcı yeniden oluşturur.

  2. Diğerlerinin de belirttiği gibi, docker-compose.ymldosyanın kendisini değiştirdiyseniz , basit yeniden başlatma bu değişiklikleri uygulamaz.

  3. Kodunuzu oluşturma aşamasında kapsayıcıya kopyalarsanız ( veya komutları Dockerfilekullanarak ), kod her değiştiğinde kapsayıcıyı ( ) yeniden oluşturmanız gerekir .ADDCOPYdocker-compose build

Kodunuzla korelasyon

docker-compose restartEğer kodunuz şu şekilde birim yönergesi ile kaba eşlenmiş yol alırsa, mükemmel şekilde çalışmalıdır docker-compose.yml:

services:

  servicename:
    volumes:
      - .:/code

Ancak muhtemelen DEBUG modunda seçtiğiniz çerçeve tarafından sağlanan canlı kod yeniden yüklemeyi kullanmanızı öneririm (alternatif olarak, otomatik yeniden yükleme paketlerini kendi dilinizde arayabilirsiniz). Bunu eklemek, kodunuz her değiştikten sonra kapsayıcıyı yeniden başlatmanın gerekliliğini ortadan kaldırmalı, bunun yerine işlemi yeniden yüklemelidir.


1

Buradaki yanıt, değişikliğin docker-compose.yml dosyasına yansımasından bahsediyor.

Ama yaptığım değişiklikleri koduma dahil etmek istersem ve bunun sadece görüntüyü yeniden oluşturarak mümkün olacağını ve aşağıdaki komutlarla yapacağımı düşünürsem

1. liman işçisi konteyneri durağı

docker stop container-id

2. liman işçisi konteyneri çıkarma

docker rm container-id

3. docker görüntü kaldırma

docker rmi image-id

4. kabı tekrar oluşturun

docker-compose up container-name
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.