Bagaimana saya bisa mengesampingkan CMD saat menjalankan gambar buruh pelabuhan?

123

Saya ingin memeriksa gambar buruh pelabuhan yang dibuat oleh orang lain dengan titik masuk dan cmd yang ditentukan, misalnya:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

Saat ini saya lakukan:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

Apakah ada cara untuk mengganti CMD menjadi kosong (jadi saya tidak perlu menggunakan "--login")?

melengkung
sumber

Jawaban:

126

Anda bisa masuk melalui docker run -it --entrypoint=/bin/bash $IMAGE -i(Anda akan meluncurkan wadah baru dari gambar dan mendapatkan bash shell dalam mode interaktif), kemudian jalankan perintah entrypoint dalam wadah itu.

Anda kemudian dapat memeriksa wadah yang sedang berjalan dalam keadaan seharusnya berjalan.

EDIT: Sejak Docker 1.3 Anda dapat menggunakan execuntuk menjalankan proses dalam wadah berjalan. Mulai wadah Anda seperti biasa, lalu masukkan dengan mengeluarkan:

docker exec -it $CONTAINER_ID /bin/bash

Dengan asumsi bash diinstal Anda akan diberikan akses shell ke wadah yang sedang berjalan.

Panagiotis Moustafellos
sumber
Bukankah itu mengeksekusi "/ usr / sbin / apache2ctl / bin / bash"? (karena contoh Anda tidak mengesampingkan titik masuk itu akan menggunakan titik masuk yang ditentukan di Dockerfile - atau apakah saya kehilangan sesuatu?)
warp
Apakah itu sesuatu yang berbeda untuk versi buruh pelabuhan yang lebih tua / yang lebih baru mungkin? Ini tentu menjalankan entrypoint untuk saya: gist.github.com/warpr/26a5cc471dce7fcf9021 . Ini menggunakan buruh pelabuhan 0.10.0 di Ubuntu 13.10.
warp
4
Saya tahu lewat --entrypoint mengesampingkan entrypoint. Tetapi ketika saya menggunakan --entrypoint, bagaimana saya mengganti CMD menjadi kosong? (Untuk bash saya bisa menggunakan sesuatu seperti -i atau --login, tetapi tidak semua pintu masuk yang ingin saya gunakan akan memiliki argumen "dummy" yang setara).
warp
1
Setidaknya dalam Docker v1.11.1 tampaknya bahwa mengesampingkan --entrypoint juga mencegah penambahan CMD normal ke entrypoint. Itu sepertinya hanya terjadi ketika titik masuk tidak diganti.
Jasmine Hegman
1
Kenapa ada -iafter $IMAGE?
Eyal Levin
27

Lihat: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

Bagian yang relevan:

CMD (Perintah atau Opsi Default). Ingat PERINTAH opsional di baris perintah Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

Perintah ini opsional karena orang yang membuat IMAGE mungkin telah memberikan PERINTAH default menggunakan Dockerfile CMD. Sebagai operator (orang yang menjalankan wadah dari gambar), Anda dapat mengesampingkan CMD itu hanya dengan menentukan PERINTAH baru.

Jika gambar juga menentukan ENTRYPOINT, CMD atau COMMAND akan ditambahkan sebagai argumen untuk ENTRYPOINT.

Jadi untuk melakukan apa yang Anda inginkan, Anda hanya perlu menentukan cmd, dan mengganti menggunakan /bin/bash. Tidak cukup "kosong", tetapi menyelesaikan pekerjaan 99%.

Simon Thum
sumber
Ups, saya mengabaikan detail. Kecuali untuk memperpendek --loginmenjadi -lsaya kira solusi Anda sudah sebaik yang didapatnya.
Simon Thum
Inilah hal yang menyenangkan yang saya lihat hari ini: perintahnya tidak ditimpa, itu ditambahkan. Inilah PS dari dalam wadah. Perhatikan bahwa perintah yang saya tambahkan adalah echo "menyiapkan db" dan perintah bawaannya adalah / usr / bin / geth. Saya juga mengatur titik masuk menjadi "". 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
Paul S
Tautan referensi buruh pelabuhan tidak lagi berfungsi - tidak dapat menemukan pengganti yang jelas untuknya.
Chris Kimpton
Saya baru saja memperbaikinya, tetapi saya juga kesulitan menemukannya; (
Simon Thum
15

Bagi siapa pun yang datang ke sini untuk menimpa entri titik DAN perintah untuk melewati perintah lain, misalnya jalankan bash bukannya skrip entri dan kemudian jalankan beberapa perintah lain dengan parameter (tidak jelas bagi saya dari jawaban lain):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...'adalah parameter untuk /bin/shjadi di sini Anda dapat melewati perintah apa pun yang ingin Anda jalankan dalam wadah. /bin/shadalah untuk gambar alpine, /bin/bashkemungkinan besar untuk gambar lainnya.

info
sumber
1
hanya perintah addtion shell yang harus ditulis berdasarkan json, jadi alih-alih mengutip dengan tanda kutip tunggal, '...'gunakan tanda kutip ganda"..."
Jimmy Obonyo Abor
Atau cukup berikan argumen --poin titik sebanyak yang Anda inginkan
Nick Roz
ini sepertinya tidak berfungsi: "exec: \" - c \ ": file yang dapat dieksekusi tidak ditemukan dalam $ PATH": tidak diketahui.
Richard
Periksa jalur dalam wadah, mungkin itu benar-benar tidak ada. Sebagian besar gambar memiliki /bin/shtetapi Anda mungkin tidak demikian.
info