Docker: Önceden oluşturulmuş bir kapsayıcıya yeniden başlatma ilkesi ekleme


229

Docker'ın, örneğin yeniden başlatma durumunda kapsayıcıların yeniden başlatılması için yeniden başlatma politikaları adı verilen bir şey eklediğini görüyorum.

Bu çok yararlı olsa da, yeniden başlatma ilke komutunun sadece ile çalıştığını docker runve çalıştığını görüyorum docker start. Benim sorum şu:

Geçmişte oluşturulmuş bir kapsayıcıya yeniden başlatma politikaları eklemenin bir yolu var mı?


Kabul edilen cevabı @Yale Huang'ın cevabına çevirmelisiniz. Kabul edilen cevap, docker'ın mevcut sürümlerinde yanlış. Yanıtın o zamanlar size yardımcı olabileceğini anlıyorum ama şimdi yanıltıcı.
Stepan Vavra

2
Bitti. uyarı için teşekkürler.
Enrique Moreno Çadırı

Yanıtlar:


575

Docker'ın son sürümlerinde (1.11'den itibaren) bir updatekomutunuz var:

docker update --restart=always <container>

9
Bu Docker 1.11.0'da eklenmiş gibi görünüyor.
phansen


4
Docker 1.11'den itibaren çalıştığı uyarıyla kabul edilen cevap olmalıdır.
JohnDoe

6
docker ile 17.09 docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel

4
docker updatebirden fazla kapsayıcı kimliği kabul eder, bu yüzden hiç gerek xargsyok, sadece yapın docker update --restart=always $(docker ps -q).
markusk

49

RestartPolicy'i değiştirmek için iki yaklaşım vardır:

  • Kapsayıcı kimliğini bulun, docker hizmetinin tamamını durdurun, /var/lib/docker/containers/CONTAINER_ID/hostconfig.json dosyasını değiştirin, RestartPolicy -> Ad'ı "her zaman" olarak ayarlayın ve docker hizmetini başlatın.
  • docker commit kabınızı yeni bir resim olarak ekleyin, geçerli kapsayıcıyı durdurun ve rm yapın ve görüntüyle yeni bir kap başlatın.

2
kapsayıcıyı durdur, düzenle, kapsayıcıyı başlat. tıkır tıkır çalışıyor. Düzenlemenin neden devre dışı olduğunu bilmiyorum.
sis

2
Sonunda, makul bir cevap :)
Navin

Docker 1.10 (sorma me) ile eski bir sunucu üzerinde benim için çalıştı. Ne yazık ki docker updateyeniden başlatma politikasını yalnızca 1.11+ 'da değiştirmenize izin veriyor
Igor Kupczyński

1

İlkeyi kullanmak --restart=always, yeniden başlatma durumunda mevcut kapsayıcıların yeniden başlatılmasını sağlar.

Sorun olduğunu varsa birden konteynerleri ile --restart=alwaysde tartışıldığı gibi daha yeni bir sürümü imajını çalıştırdığınızda docker - nasıl bir kap üzerinde size devre dışı otomatik yeniden başlatma mı? .

Put seçeneği ile var olduğunda kapsayıcıyı otomatik olarak kaldırmaya çalışmak, birbirleriyle çakıştıklarından ilke docker run --rmile de sorun yaratacaktır .--restart=always

$ docker run --rm --restart always <image>
Conflicting options: --restart and --rm

Bu durumda, başka bir seçenek seçmek daha iyidir: - durdurulmadığı sürece yeniden başlat politikası.

$ docker run --rm --restart unless-stopped <image>

Bu politika çelişkili olmazdocker run --rm ama açıklandığı liman işçisi belgelerinde :

Konteyner durduğunda (manuel veya başka şekilde) Docker arka plan programı yeniden başlatıldıktan sonra bile yeniden başlatılmaması --restart=alwaysdışında buna benzer .

Bu nedenle --restart unless-stopped, terminali kapattığınızda kazayla durması durumunda yeniden başlatmanın çalıştığından emin olmak için aşağıdaki gibi başka bir terminalde bir kez yapın :

$ docker ps
$ docker restart <container>

Öldürme işlemi önceki mermide bitene kadar bekleyin, sonra kapatın ve bırakın ( çıkmayın ).
Kalan terminalde kabın hala çalışıp çalışmadığını tekrar kontrol edin:

$ docker ps

Hala çalışıyorsa, güvenli bir şekilde yeniden başlatabilir ve uygulamanın yeniden başlatıldığını tekrar kontrol edebilir ve liman işçinizin birden fazla kap kullanmadan temiz olduğunu görebilirsiniz.

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.