Docker Compose kapsayıcıyı çalışır durumda tutun


94

Docker-compose ile bir hizmet başlatmak ve kapsayıcının IP adresini 'docker inspect' aracılığıyla alabilmek için çalışır durumda tutmak istiyorum. Bununla birlikte, konteyner her zaman başlatıldıktan hemen sonra çıkar.

Docker-compose.yml dosyasına "command: [" sleep "," 60 "]" ve diğer şeyleri eklemeye çalıştım, ancak "command: ..." satırını her eklediğimde "docker-compose up" çağrısı yapamıyorum "Kapsayıcı başlatılamıyor ..... Sistem hatası: değerin başlangıcını arayan geçersiz 'k' karakteri" mesajını alacağım

Ayrıca Dockerfile'ın kendisine "CMD sleep 60" eklemeyi denedim, ancak bu komutlar yürütülüyor gibi görünmüyor.

Konteyneri canlı tutmanın veya sorunlarımdan birini çözmenin kolay bir yolu var mı?

DÜZENLEME: Çalıştırmak istediğim Compose dosyası:

version: '2'
services:
  my-test:
    image: ubuntu
    command: bash -c "while true; do echo hello; sleep 2; done"

İyi çalışıyor Bunu OS X altında docker-compose ile başlatırsam, ancak Ubuntu 16.04 altında aynı şeyi denersem, bana yukarıdaki hata mesajını verir.

Yaklaşımı Dockerfile ile denersem, Dockerfile şöyle görünür:

FROM ubuntu:latest
CMD ["sleep", "60"]

Hiçbir şey yapmıyor gibi görünen

DÜZENLEME 2: Kendimi düzeltmem gerekiyor, bunun Dockerfile ve docker-compose.yml ile aynı sorun olduğu ortaya çıktı: Dockerfile'a her "CMD ..." veya "command ..." oluşturma dosyası, geçersiz karakter ile yukarıdaki hata alıyorum. Her iki komutu da kaldırırsam kusursuz çalışıyor.


1
Lütfen docker-compose.yml, Dockerfile ve hata ayıklamaya çalıştığınız tüm komut dosyalarını ekleyin.
BMitch

Yanıtlar:


118

Bir konteyneri başlattığınızda çalışır durumda tutmak docker-composeiçin aşağıdaki komutu kullanın

command: tail -F anything

Böylece docker-compose.yml dosyanız

version: '2'
services:
  my-test:
    image: ubuntu
    command: tail -F anything

ve aşağıdaki komutu kullanarak kapsayıcıya girmek için bir kabuk çalıştırabilirsiniz

docker exec -i -t composename_my-test_1 bash

kapsayıcılarınızın başına eklenen composenamead nerede docker-compose.


1
İşiniz bittiğinde kabı nasıl durdurursunuz? Ctrl + C, Ctrl + Z tipi bir komut var mı? Şu anda çıkmak için terminali kapatmam gerekiyor.
mac10688

Kabın içindeyseniz, exitana makinenize geri dönmek için yazabilirsiniz . Ana makinenizdeyseniz, kapsayıcıyı Docker ( docker stop composename_my-test_1) veya Docker Compose ( docker-compose stop) kullanarak durdurabilirsiniz .
Nick Settje

2
@ Alexis.Rolland Yeni bir SO sorusu sormaya ve daha fazla ayrıntı paylaşmaya istekliysen, bir göz atmaktan mutluluk duyarım. Tahminimce, Docker veya ana bilgisayar işletim sisteminizle ilgili bir sorunun aksine, hatanızın konteynerlerinizden birinin iç kısımlarıyla bir ilgisi var.
Nick Settje

1
@ mac10688 bağlı kapsayıcı oturumunuzda istem yoksa, ayırmak için ctrl-d'yi deneyin
Stark

5
/dev/nullanythingkuyruk komutu ref için yerinde daha iyi olurdu . stackoverflow.com/a/48732671/248616
Nam G VU

80

ttyYapılandırma seçeneğini kullanabilirsiniz .

version: '3'

services:
  app:
    image: node:8
    tty: true           # <-- This option

Not: Dockerfile'ı imaj için ve CMDDockerfile'da kullanırsanız, bu seçenek çalışmayacaktır; ancak, entrypointoluşturma dosyasındaki seçeneği CMDDockerfile'dan temizleyen seçeneği kullanabilirsiniz .


7
Bu işe yarıyor ve daha az hilekar görünüyor tail -f /dev/null. Bununla, postgres veritabanına eklenmiş bir konteynerleştirilmiş geliştirme ortamını docker-compose upçalıştırabilir ve kullanarak başka bir terminal üzerinden bir kabuk çalıştırabilirim docker exec.
Psiloc

1
Şu anda iyi belgelenmemiş olsa da. Bu, tail -f /dev/nullveya ile aynı etkiyi sağlayacak resmi bir seçenektir tail -f anything, buraya bakın: docs.docker.com/compose/compose-file
b01

2
@ABMRuman & Psiloc, sadece docker-compose.yml dosyasında "command" kullanmadığınızda çalışır. "Command" komutunu kullanırken başka bir hack'e ihtiyacınız var - bu yüzden tail -F hack burada mükemmel bir şekilde uyuyor.
asafel

Dockerfile'da giriş noktası kullanıyorsanız, bu en iyi cevap olmalıdır.
DDKV587

53

Dayanarak GitHub Ağustos 26, 2015 tarihinde @aanand yorumlama , tek kullanabilirsiniz tail -f /dev/nullkonteyner çalışmaya devam etmesi için liman işçisi-Oluşturma penceresinde.

docker-compose.yml örneği

version: '3'
services:
  some-app:
    command: tail -f /dev/null

Neden bu komut?

Bu seçeneği seçmenin tek nedeni GitHub'da çok beğenilmiş olmasıydı, ancak en yüksek oyu alan yanıt bunun en iyi yanıt olduğu anlamına gelmiyor. İkinci neden, son tarihler nedeniyle sorunların mümkün olan en kısa sürede çözülmesi gerektiğinden pragmatik bir nedendi.


2
neden tam olarak bu komut? Onu diğerlerinden daha iyi yapan nedir? Benim durumumda sadece bir bash başlatmak da hile yaptı ...
N4ppeL

@ N4ppeL Güzel soru. Bu seçeneği seçmemin tek nedeni, github'da çok beğenilmiş olmasıydı, ancak en yüksek oyu alan yanıt bunun en iyi yanıt olduğu anlamına gelmiyor. İkincisi pragmatik bir sebepti çünkü son tarihler nedeniyle sorunu bir an önce çözmem gerekiyordu.
030

17
  • Adlı bir dosya oluşturun docker-compose.yml
  • Aşağıdakileri dosyaya ekleyin
version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    tty: true
  • Aynı dizinde kalmak docker-compose up -d, terminalden çalıştırın
  • docker psKapsayıcı kimliğini veya adını almak için çalıştırın
  • Koşabilirsin docker inspect $container_id
  • Konteynere girebilir ve bir bash shell çalıştırabilir docker-compose exec ubuntu /bin/bashveyadocker-compose exec ubuntu /bin/sh
  • İşiniz bittiğinde, kabın dışında olduğunuzdan ve koştuğunuzdan emin olun. docker-compose down

my-docker-shell.shDocker compose dosyasını oluşturmak, kapsayıcıyı çalıştırmak, kapsayıcıda oturum açmak ve ardından oturumu kapattığınızda son olarak docker container'ı ve docker compose dosyasını temizlemek için küçük bir bash script ( ) var.

#!/bin/bash

cat << 'EOF' > ./docker-compose.yml
---

version: "3"

services:
  ubuntu:
    image: ubuntu:latest
    command: /bin/bash
    # tty: true

...
EOF

printf "Now entering the container...\n"
docker-compose run ubuntu bash
docker-compose down

rm -v ./docker-compose.yml

1
Bu soruya gerçek bir cevap olmasa da, son derece değerli buldum! Bu yaklaşım için global bashrc işlevlerini kullanmak için daha da ileri gittim: gist.github.com/loopmode/4d59a4e9a0a2ffacaec2dd14db4ae8bd
loopmode

8

Dockerfile'da şu komutu kullanabilirsiniz:

{CMD sleep infinity}

2

Yorumcunun belirttiği gibi, size eksiksiz bir cevap verebilmek için söz konusu Dockerfile'ı görmemiz gerekir, ancak bu çok yaygın bir hatadır. Çalıştırmaya çalıştığınız komutun bir arka plan işlemi başlattığını hemen hemen garanti edebilirim. Bu, Docker dışı durumlarda çalıştıracağınız komut olabilir, ancak bir Dockerfile'da yapılması yanlış bir şeydir. Örneğin, çalıştırdığınız şey tipik olarak bir sistem hizmeti olarak tanımlanmışsa, "systemctl start" gibi bir şey kullanabilirsiniz. Bu, işlemi arka planda başlatır ve işe yaramaz. İşlemi ön planda çalıştırmanız gerekir, böylece tüm süreç engellenir.


0

Sadece hızlı bir not

Tek bir görüntüyü temel alarak test ettim golang, bu yüzden docker-compose downburayı aradığımda elde ettiğim şey:

version: "3.1"
...
command: tail -f /dev/null   # stopping container takes about 10 sec.
tty: true                    # stopping container takes about 2 sec.

Sistem bilgilerim:

Ubuntu 18.04.4 LTS (64-bit)
Docker version 19.03.6, build 369ce74a3c
docker-compose version 1.26.0, build d4451659

-3

Tamam hatamı buldum. Compose için kullanılan imaj için Dockerfile'da temel görüntünün ubuntu: latest olması gerektiğini belirttim, ancak daha önce kendi başıma ubuntu adlı bir imaj oluşturdum ve bu imaj çalışmadı. Bu yüzden orijinal ubuntu görüntüsünü kullanmadım, bunun yerine kendi resmimin ubuntu olarak da adlandırılan bozuk bir versiyonunu kullandım.

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.