Docker'da konteyner çalıştırma / durdurma komutunun tamamına bakın


263

Docker'da çalışan bir kapsayıcı / işlemin tam komutunu nasıl görebilirim?

$ docker ps --all
CONTAINER ID    IMAGE          COMMAND                 CREATED          STATUS                     PORTS    NAMES
5b6291859b61    nginx:1.7.8    "nginx -g 'daemon of    4 minutes ago    Exited (0) 4 minutes ago            thirsty_brattain

Ben sadece "nginx -g 'daemon of" görebilirsiniz burada, tam komut değil.


2
ayrıca buraya bakın: stackoverflow.com/q/32758793/1747983
Tilo

Yanıtlar:


544

docker ps --no-trunc çalışan komutların diğer ayrıntılarıyla birlikte tam komutu görüntüleyecektir.


13
Teşekkürler bu çok yardımcı oldu. Sadece bir not: '-notrunc' kullanımdan kaldırıldı, onun yerini aldı --no-trunc.
Prometheus

2
Bu benim için işe yaramadı. Bana komutu verdi ama tüm anahtarları değil ("tam komut" kullanırken ne düşündüğüm). Yukarıdaki diğer bağlantıdan söz edilen runlike komutu benim için daha iyi çalıştı.
Dylan Smith

1
sadece çalışan kapların tam komutu için tüm komutu kaldırmanız yeterlidir. docker ps --no-trunc
Jacob Morris

Teşekkürler - düzeltildi. Önceki komutum, sadece asıl soru olan kapları çalıştırmak değil tüm kapsayıcılar içindi.
Scott S.19

Kesilmemiş komut çok uzun olabilir, her satırda sadece ilk 400 karaktere bakındocker ps --all --no-trunc|cut -c-400
rubo77

183

kullanın:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

... tüm konteynerler için bir "liman işçisi incelemesi" yapar.


8
Bu, docker ps komutunu görüntülemez. Docker ps komutu docker incelemesi Path ve Args'a karşılık gelir.
JDiMatteo

3
Ocak 2018 itibariyle bueno yok
sg

4
iedocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul

2
Sadece sudokomutun önüne atıyorsanız , "docker inspect" requires at least 1 argument(s).tüm kapsayıcı adlarını almak için ikinci çağrı nedeniyle alacaksınız, muhtemelen içine bir sudo eklemek isteyeceksiniz $(.
RandomInsano

ve -f sorgusunu daha iyi anlamak isteyenler için burada iyi bir açıklama buldum container-solutions.com/docker-inspect-template-magic
intijk

16

kullanın:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)

Buna benzer komut yolu ve bağımsız değişkenler görüntülenir docker ps.


Bunun gibi belirli bir komutu aramak için bunu nasıl değiştirirsiniz kube-apiserver?
Jonathan

@Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
RRW

8

Git deposundan runlike kullanın https://github.com/lavie/runlike

Runlike kurmak için

pip install runlike

Kapsayıcı kimliğini bağımsız değişken olarak kabul ettiğinden kapsayıcı kimliğini ayıklamak için aşağıdaki komutu kullanın

docker ps -a -q

Aşağıdaki komutu kullanarak tam docker run komutunu ayıklamak için runlike kullanabilirsiniz

runlike <docker container ID>

Çalışmıyor. "Command '[' docker ',' inspect ', u'06e6a369f909'] 'sıfır dışında çıkış durumu 1 döndürdü"
fstang

Bahsettiğim gibi koştun mu
Abhishek Jain

5
Daha da iyisi, bir liman işçisi konteyneri içinde runlike çalıştırabilir ve kurmaktan kaçınabilirsiniz:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith

3

TP-DR

docker ps --no-truncve docker inspect CONTAINERiletilen komutun yanı sıra, kapsayıcıyı başlatmak için yürütülen giriş noktasını sağlayın, ancak ${ANY_VAR}kap ortamı değişkenleri çözümlenmiş olarak yazdırılmadığı için bazı bölümleri kaçırabilir .

Bunun üstesinden gelmek docker inspect CONTAINER, bir avantajı vardır, çünkü aynı zamanda env değişkenlerini ve kapta tanımlanan değerlerini Config.Envmülkten ayırmaya da izin verir .

docker psve docker inspectyürütülen giriş noktası ve komutu hakkında bilgi sağlar. Genellikle, bu .shkap tarafından başlatılan "gerçek" program değil , bir sarıcı giriş noktası komut dosyasıdır ( ). Bununla ilgili bilgi almak için, işlem bilgilerini psveya /proc/1/cmdlineyardımını isteyin.


1) docker ps --no-trunc

Giriş noktasını ve çalışan tüm kapsayıcılar için yürütülen komutu yazdırır. Giriş noktasına iletilen komutu yazdırırken (bunu geçersek), docker env değişkenlerinin ( $FOOveya gibi ${FOO}) değerini göstermez .
Kaplarımız env değişkenleri kullanıyorsa, yeterli olmayabilir.

Örneğin, bir alp kabı çalıştırın:

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

Docker -ps kullanırken aşağıdaki gibi:

docker ps -a --filter adı = alp-örneği --no-trunc

Yazdırır:

KONTEYNER KİMLİĞİ GÖRÜNTÜ KOMUTU OLUŞTURULAN DURUM LİMANLARI İSİMLERİ
5b064a6de6d8417 ... alpine: en son "sh -c 'ls $ MY_VAR'" 2 dakika önce Çıkış (0) 2 dakika önce alpine-example

Komutun giriş noktasına aktarıldığını görüyoruz: sh -c 'ls $MY_VAR'ancak $MY_VAR gerçekten çözülmedi.

2) docker inspect CONTAINER

Alpin örnek kabını incelediğimizde:

docker inspect alpine-example | grep -4 Cmd

Komut da orada ancak hala env değişkeni değerini görmüyoruz:

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

Aslında, bu docker komutlarıyla enterpolasyonlu değişkenleri göremedik.
Bir takas olarak, docker incelemesi olan bir konteyner için hem komut hem de env değişkenlerini ayrı ayrı görüntüleyebiliriz:

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

Bu yazdırır:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

Daha yapıcı bir yol, oluşturulacak JSON özniteliklerini belirtmeye izin veren --formatbayrağını kullanmak olacaktır docker inspect:

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

Bu çıktı:

/ alp-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]

3) Çalıştırılan kaplar için başlatılan işlemi kabın kendisinden alın

Docker tarafından yürütülen giriş noktası ve komut yardımcı olabilir, ancak bazı durumlarda bu yeterli değildir, çünkü bu yalnızca .shgerçek / çekirdek işlemini başlatmaktan sorumlu bir sarıcı giriş noktası komut dosyasıdır ( ).
Örneğin, bir Nexus kapsayıcısını çalıştırdığımda, kapsayıcıyı çalıştırmak için yürütülen ve gösterilen komut "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
PostgreSQL için "docker-entrypoint.sh postgres".

Daha fazla bilgi almak için, çalışan bir kapsayıcı üzerinde çalışabiliriz docker exec CONTAINER ps aux.
Bizi ilgilendirmeyecek başka süreçler de basabilir.
Giriş noktası tarafından başlatılan ilk işlemi daraltmak için şunları yapabiliriz:

docker exec CONTAINER ps -1

Belirttiğim 1GirişNoktası tarafından yürütülen işlem genellikle ile biridir çünkü 1id.

Olmadan ps, hala bilgileri bulabiliriz /proc/1/cmdline(Linux dağıtımlarının çoğunda, ancak hepsinde değil). Örneğin :

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    

Kapsayıcıyı başlatan docker ana bilgisayarına erişimimiz varsa, giriş noktası tarafından yürütülen işlemin tam komutunu almanın başka bir yolu:: execute ps -PIDburada PID, Docker arka plan programı tarafından kapsayıcıyı çalıştırmak için oluşturulan yerel işlemdir:

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

Docker PS ile kullanıcı dostu biçimlendirme

docker ps --no-truncokunması her zaman kolay değildir.
Yazdırılacak sütunları ve tablo biçiminde belirtmek onu daha iyi hale getirebilir:

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

Bir takma ad oluşturmak aşağıdakilere yardımcı olabilir:

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'

2

Dylan'ın yorumunu tam anlamıyla bir cevaba taşımak çünkü ÇOK FAYDALI:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

Bu ne işe yarıyor? Çalıştırır https://github.com/lavie/runlike halde sana tam liman işçisi hareket komutunu alır, bir konteynerin içinde sizin için kabı kaldırır.

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.