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.
Jawaban:
docker ps --no-trunc
akan menampilkan perintah lengkap bersama dengan detail lain dari wadah yang sedang berjalan.sumber
--no-trunc
.docker ps --no-trunc
docker ps --all --no-trunc|cut -c-400
Menggunakan:
... itu melakukan "buruh pelabuhan memeriksa" untuk semua kontainer.
sumber
docker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
sudo
di 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$(
.Menggunakan:
Itu akan menampilkan jalur perintah dan argumen, mirip dengan
docker ps
.sumber
kube-apiserver
?docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
Gunakan runlike dari repositori git https://github.com/lavie/runlike
Untuk menginstal runlike
Karena ia menerima id kontainer sebagai argumen sehingga untuk mengekstrak id kontainer gunakan perintah berikut
Anda baik menggunakan runlike untuk mengekstrak perintah run docker lengkap dengan perintah berikut
sumber
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
TL-DR
docker ps --no-trunc
dandocker inspect CONTAINER
menyediakan 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 CONTAINER
memiliki keunggulan karena juga memungkinkan untuk mengambil secara terpisah variabel env dan nilainya ditentukan dalam wadah dariConfig.Env
properti.docker ps
dandocker inspect
memberikan 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 denganps
atau/proc/1/cmdline
bantuan.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
$FOO
atau${FOO}
).Jika kontainer kami menggunakan variabel env, itu mungkin tidak cukup.
Misalnya, jalankan wadah alpine:
Saat menggunakan buruh pelabuhan -ps seperti:
Mencetak:
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:
Perintah juga ada di sana tetapi kita masih tidak melihat nilai variabel env:
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:
Itu mencetak:
Cara buruh pelabuhan lainnya adalah dengan menggunakan
--format
flagdocker inspect
yang memungkinkan untuk menentukan atribut JSON untuk di-render:Keluaran itu:
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:
Saya menentukan
1
karena proses yang dijalankan oleh entrypoint umumnya adalah yang dengan1
id.Tanpa
ps
, kami masih dapat menemukan informasi di/proc/1/cmdline
(di sebagian besar distro Linux tetapi tidak semua). Sebagai contoh :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 -PID
mana PID adalah proses lokal yang dibuat oleh daemon Docker untuk menjalankan wadah seperti:Pemformatan yang mudah digunakan dengan buruh pelabuhan ps
docker ps --no-trunc
tidak selalu mudah dibaca.Menentukan kolom yang akan dicetak dan dalam format tabular mungkin membuatnya lebih baik:
Buat alias dapat membantu:
sumber
Memindahkan komentar Dylan menjadi jawaban penuh karena TERLALU BERMANFAAT:
Apa fungsinya? Menjalankan https://github.com/lavie/runlike di dalam sebuah wadah, memberi Anda perintah run docker lengkap, kemudian menghapus wadah untuk Anda.
sumber