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}}"'