Lihat perintah penuh untuk menjalankan / menghentikan kontainer di Docker

263

Bagaimana saya bisa melihat perintah penuh dari wadah / proses yang sedang berjalan di Docker?

$ 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

Saya hanya bisa melihat "nginx -g 'daemon of" .. di sini, bukan perintah lengkap.

Niklas9
sumber
2
lihat di sini juga: stackoverflow.com/q/32758793/1747983
Tilo

Jawaban:

545

docker ps --no-trunc akan menampilkan perintah lengkap bersama dengan detail lain dari wadah yang sedang berjalan.

Scott S.
sumber
13
Terima kasih, ini banyak membantu. Hanya sebuah catatan: '-notrunc' sudah usang, diganti dengan --no-trunc.
Prometheus
2
Ini tidak berhasil untuk saya. Itu memberi saya perintah tetapi tidak semua switch (yang saya pikirkan ketika menggunakan "perintah penuh"). Perintah runlike menyebutkan tautan lain di atas bekerja lebih baik untuk saya.
Dylan Smith
1
untuk perintah penuh hanya menjalankan wadah cukup hapus semua perintah. docker ps --no-trunc
Jacob Morris
Terima kasih - dikoreksi. Perintah saya sebelumnya adalah untuk semua kontainer dan bukan hanya menjalankan kontainer yang merupakan pertanyaan awal.
Scott S.
Perintah yang tidak dikunci bisa sangat panjang, lihat hanya 400 karakter pertama setiap baris dengandocker ps --all --no-trunc|cut -c-400
rubo77
183

Menggunakan:

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

... itu melakukan "buruh pelabuhan memeriksa" untuk semua kontainer.

st0ne
sumber
8
Ini tidak menampilkan perintah docker ps. Perintah buruh pelabuhan sesuai dengan buruh pelabuhan memeriksa Path dan Args.
JDiMatteo
3
Tidak ada bueno pada Jan 2018
sg
4
yaitudocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul
2
Jika Anda hanya melempar sudodi depan perintah, Anda akan mendapatkan "docker inspect" requires at least 1 argument(s).karena panggilan kedua untuk mendapatkan semua nama kontainer, Anda mungkin ingin menambahkan sudo tepat di dalam $(.
RandomInsano
dan bagi mereka yang ingin lebih memahami permintaan -f, saya telah menemukan penjelasan yang baik di sini container-solutions.com/docker-inspect-template-magic
intijk
16

Menggunakan:

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

Itu akan menampilkan jalur perintah dan argumen, mirip dengan docker ps.

JDiMatteo
sumber
Bagaimana Anda akan memodifikasi ini untuk mencari perintah tertentu seperti kube-apiserver?
Jonathan
@ Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw
8

Gunakan runlike dari repositori git https://github.com/lavie/runlike

Untuk menginstal runlike

pip install runlike

Karena ia menerima id kontainer sebagai argumen sehingga untuk mengekstrak id kontainer gunakan perintah berikut

docker ps -a -q

Anda baik menggunakan runlike untuk mengekstrak perintah run docker lengkap dengan perintah berikut

runlike <docker container ID>
Abhishek Jain
sumber
Tidak bekerja Perlihatkan "Command '[' docker ',' inspect ', u'06e6a369f909'] 'mengembalikan status keluar 1-nol"
fstang
Sudahkah Anda menginstal runlike seperti yang saya sebutkan
Abhishek Jain
5
Bahkan lebih baik Anda dapat menjalankan runlike dalam wadah buruh pelabuhan dan menghindari menginstalnya:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith
3

TL-DR

docker ps --no-truncdan docker inspect CONTAINERmenyediakan titik masuk yang dijalankan untuk memulai wadah, sepanjang perintah yang diteruskan ke, tetapi itu mungkin kehilangan beberapa bagian seperti ${ANY_VAR}karena variabel lingkungan wadah tidak dicetak sebagai terselesaikan.

Untuk mengatasinya, docker inspect CONTAINERmemiliki keunggulan karena juga memungkinkan untuk mengambil secara terpisah variabel env dan nilainya ditentukan dalam wadah dari Config.Envproperti.

docker psdan docker inspectmemberikan informasi tentang titik masuk yang dieksekusi dan perintahnya. Seringkali, itu adalah skrip entrypoint wrapper ( .sh) dan bukan program "asli" yang dimulai oleh kontainer. Untuk mendapatkan informasi tentang itu, meminta informasi proses dengan psatau /proc/1/cmdlinebantuan.


1) docker ps --no-trunc

Ini mencetak titik masuk dan perintah dieksekusi untuk semua wadah yang berjalan. Saat ia mencetak perintah yang diteruskan ke titik masuk (jika kita melewatinya), itu tidak menunjukkan nilai variabel buruh pelabuhan (seperti $FOOatau ${FOO}).
Jika kontainer kami menggunakan variabel env, itu mungkin tidak cukup.

Misalnya, jalankan wadah alpine:

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

Saat menggunakan buruh pelabuhan -ps seperti:

buruh pelabuhan ps -a --filter name = alpine-example --no-trunc

Mencetak:

KOMANDA ID GAMBAR PERINTAH NAMA STATUS BUATAN STATUS
5b064a6de6d8417 ... alpine: terbaru "sh -c 'ls $ MY_VAR'" 2 menit lalu Keluar (0) 2 menit lalu alpine-example

Kita melihat perintah dilewatkan ke titik masuk: sh -c 'ls $MY_VAR'tetapi $MY_VAR memang tidak diselesaikan.

2) docker inspect CONTAINER

Saat kami memeriksa wadah alpine-example:

docker inspect alpine-example | grep -4 Cmd

Perintah juga ada di sana tetapi kita masih tidak melihat nilai variabel env:

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

Bahkan, kami tidak bisa melihat variabel yang diinterpolasi dengan perintah buruh pelabuhan ini.
Sementara sebagai trade-off, kita dapat menampilkan secara terpisah variabel perintah dan env untuk sebuah wadah dengan buruh pelabuhan memeriksa:

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

Itu mencetak:

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

Cara buruh pelabuhan lainnya adalah dengan menggunakan --formatflag docker inspectyang memungkinkan untuk menentukan atribut JSON untuk di-render:

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

Keluaran itu:

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

3) Ambil proses yang dimulai dari wadah itu sendiri untuk menjalankan wadah

Entrypoint dan perintah yang dieksekusi oleh buruh pelabuhan mungkin membantu tetapi dalam beberapa kasus, itu tidak cukup karena itu adalah "hanya" skrip entrypoint wrapper ( .sh) yang bertanggung jawab untuk memulai proses nyata / inti.
Misalnya ketika saya menjalankan wadah Nexus, perintah yang dijalankan dan ditunjukkan untuk menjalankan kontainer adalah "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
Untuk PostgreSQL "docker-entrypoint.sh postgres".

Untuk mendapatkan informasi lebih lanjut, kita bisa mengeksekusi di wadah yang sedang berjalan docker exec CONTAINER ps aux.
Mungkin mencetak proses lain yang mungkin tidak menarik bagi kita.
Untuk mempersempit proses awal yang diluncurkan oleh entrypoint, kita bisa melakukan:

docker exec CONTAINER ps -1

Saya menentukan 1karena proses yang dijalankan oleh entrypoint umumnya adalah yang dengan 1id.

Tanpa ps, kami masih dapat menemukan informasi di /proc/1/cmdline(di sebagian besar distro Linux tetapi tidak semua). Sebagai contoh :

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

Jika kita memiliki akses ke host buruh pelabuhan yang memulai wadah, alternatif lain untuk mendapatkan perintah penuh dari proses yang dieksekusi oleh titik masuk adalah:: jalankan di ps -PIDmana PID adalah proses lokal yang dibuat oleh daemon Docker untuk menjalankan wadah seperti:

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

Pemformatan yang mudah digunakan dengan buruh pelabuhan ps

docker ps --no-trunctidak selalu mudah dibaca.
Menentukan kolom yang akan dicetak dan dalam format tabular mungkin membuatnya lebih baik:

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

Buat alias dapat membantu:

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

Memindahkan komentar Dylan menjadi jawaban penuh karena TERLALU BERMANFAAT:

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

Apa fungsinya? Menjalankan https://github.com/lavie/runlike di dalam sebuah wadah, memberi Anda perintah run docker lengkap, kemudian menghapus wadah untuk Anda.

Gunar Gessner
sumber