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")?

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.


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%.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.