Docker konteynerini tutmanın doğru yolu, düzenli işler için kullanıldığında başladı


41

Yüklü ve yapılandırılmış bir yazılımı olan docker konteynerim var.

Her zaman başlatılması / çalıştırılması gereken herhangi bir program yoktur.

İstediğim şey - harici olaylara bağlı olarak bazı komutları başlatma yeteneği. sevmek:

docker exec mysupercont /path/to/mycommand -bla -for

ve

docker exec mysupercont /path/to/myothercommand 

Ancak kap durdurulduğunda "exec" imkansızdır ve ayrıca bu kap içinde bu komutlar için kullanılan bazı "çalışan" verilere sahiptir, bu yüzden kullanamıyorum.

docker run ...

her seferinde, çünkü kabı görüntüden yeniden yaratıyor ve verilerimi yok ediyor.

Bu tür bir kabı çalışır halde tutmak için "doğru" ve "en iyi" yol nedir? İçinden hangi komutu başlatabilirim?


Bu çok iyi açıklanmış bir soru. Burada benzer bir başka yazıya bakın .
Grant Li,

1
docker run -d --name=name container tail -f /dev/null
steampower,

Yanıtlar:


46

Her seferinde performans göstermenize gerek yoktur docker run.

docker run aslında iki komut dizisidir: "create" ve "start".

Kapsayıcıyı çalıştırdığınızda, " -it" belirtmelisiniz :

-i, --interactive = false Bağlı olmasa bile
STDIN'i açık tutun -t, --tty = false Sahte bir TTY ayırın

Örnek:

docker run -it debian:stable bash

İş tamamlandıktan sonra başlangıçta belirtilen komut (benim örneğimde bash). Örneğin, "exit" gerçekleştirin. Konteyner durur:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES
1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

Şimdi tekrar başlatabilirsin

docker start 1329c99a831b

Kap başlatılır ve tekrar "bash" komutunu çalıştırır.
Bu oturuma "bash" komutuyla bağlanın

docker attach 1329c99a831b

Özetlemek gerekirse : runve startcontainer arasındaki farkı anlamanız gerekir .
Ayrıca, "Çalıştır" için " " ve " " parametrelerinin rolü ile ilgili belgelere bakın.-i t-d


1
aha, bunu anlıyorum. Soru şuydu: Konteynerin içinde koşacak hiçbir şeyim yok, ama onu "çalıştırma" durumunda tutmam gerekiyor Yani cevabınız - kabı çalışır durumda tutmak için bash kullanıyor musunuz?
Korjavin İvan

Evet. Çalışma zamanında belirlediğiniz işlem, kabın çalışmasına devam etmeli. En basit örnek bash. Belki de "-d" ile kabı çalıştırmanın ve gerektiğinde kullanarak bağlanmanın en kolay yolu siz olacaksınız docker attach ID. Bu seanstan bash bitmeden CTRL-p CTRL-q
çıkın

Konteyner çalışması sırasında belirttiğiniz işlem PID 1'i alır. Buna göre, konteyner sadece onsuz çalışamaz. ☺
MSemochkin

Start ve attach ile (veya -ai ile başlayan) deneyimim, komut satırınızın hızlı ve etkileşimli düzenlemesinin gösterilmemesidir. EG, tty oluşturma veya yankı vermiyor.
dlamblin

1
Bu çok şık. Konteyneri arka planda manuel olarak tekrar başlatmak zorunda kalmadan başlatmak istiyorsanız (bir web servisini çalıştırıyorsanız, örneğin), '-itd' parametrelerini ve CTRL-p CTRL-q 'yi durdurmadan ayırmak için kullanın. bir kap.
taranaki

6

Durdurulan bir kabı başlatabilmeniz veya başlatmamanın tüm işi, kabın başlangıçta nasıl yaratıldığına, yani nasıl çalıştığına bağlıdır. Sona eren bir komutu çalıştırdıysanız veya etkileşimli bir komuttan çıkarsanız, örneğin bash, durdurulan kabı başlatamaz, yeniden başlatamaz veya çalıştıramazsınız. Tek yapabileceğiniz onu kaldırmak. Bu önemsiz.

Ancak taranaki'nin son yorumu, '-itd' kullanımı, liman işçisi sipariş ettiği gibi görünüyor.

Konteynır çalışmaya devam eder ve ne istersen uygulayabilir ve konteyneri durdurabilir, başlatabilir veya yeniden başlatabilirsiniz. Tabii ki, bu sadece alpin imajına dayanan bir ön bulgu. Konteynere takarsanız, çıkışta duracağına dikkat edin, ancak tekrar başlatabilirsiniz.


2
+1 "liman işçisi emrettiği gibi görünüyor" :-)
Matt Alexander

5

Periyodik görevlerden bahsettiğinizden ve muhtemelen kullanmak istediğiniz şekilde cron gibi bir şey kullandığınızdan docker exec, sizin için sadece ilacım var. En azından böyle bir şey yaptım.

  1. Dockerfile

    FROM <some base>
    CMD tail -f /dev/null
    
  2. Her zamanki gibi koş docker run -d ....(kullandım docker-compose)

  3. Örneğin, ana makine makinelerini crontab olarak ayarlayın:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1
    * * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
    

Docker, iş mantığınızın daha egzotik deps ve ortam değişkenlerini ele alırken, oldukça varsayılan bir Linux ortamında eski ve kanıtlanmış crontab'a güvendiğimiz için bu çözümü güzel buluyorum. Periyodik görevleriniz sıkışırsa ve bellek sızıntısı olursa veya herhangi bir şekilde olursa, bazı sınırlamalar da belirleyebilirsiniz.


0

Kuyruk hala zaman zaman bazı dosya işlemlerine neden olur.

İşte herhangi bir yan etkisi olmadan sonsuza kadar uyumak için benim çözüm.

# Ah, ha, ha, ha, stayin' alive...
while true; do :; done & kill -STOP $! && wait $!

Nasıl çalışır

while true; do :; done & # do nothing(:) in background, in an endless loop
kill -STOP $!            # stop the background process of doing nothing
wait $!                  # wait forever, because doing nothing process is stopped

1
ne yaptığını anlamak zor. neden sadece uyumak değil 3650d
Pieter

1
Haklısın, uyku muhtemelen çözümüm kadar iyi çalışır, ancak uyku sonunda zaman aşımına uğrar: - D PS: Çözümümün anlaşılmasını kolaylaştıracak bazı yorumlar ekleyeceğim.
qoomon
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.