Saya membuat wadah dengan -d
sehingga tidak interaktif.
docker run -d shykes/pybuilder bin/bash
Saya melihat bahwa wadah telah keluar:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen
Sekarang saya ingin menjalankan perintah sesekali pada mesin dan keluar. Hanya untuk mendapat tanggapan.
Saya mencoba menyalakan mesin. Saya mencoba melampirkan. Saya pikir saya bisa menelepon run
dengan sebuah wadah, tetapi itu sepertinya tidak diizinkan. Menggunakan start
sepertinya berjalan dan kemudian ada dengan cepat.
Saya ingin kembali ke mode interaktif setelah keluar.
Saya mencoba:
docker attach d6c45e8cc5f0
Tapi saya mendapatkan:
2014/10/01 22:33:34 You cannot attach to a stopped container, start it first
Tetapi jika saya memulainya, itu tetap keluar. Tangkap 22. Saya tidak bisa menang.
docker container ls -a
Jawaban:
Pada Oktober 2014 tim Docker memperkenalkan
docker exec
perintah : https://docs.docker.com/engine/reference/commandline/exec/Jadi sekarang Anda dapat menjalankan perintah apa pun dalam wadah yang sedang berjalan hanya dengan mengetahui ID (atau namanya):
Perhatikan bahwa
exec
perintah hanya berfungsi pada wadah yang sudah berjalan. Jika kontainer saat ini dihentikan, Anda harus menjalankannya dengan perintah berikut:Yang paling penting di sini adalah
-d
opsi, yang merupakan kependekandetached
. Ini berarti bahwa perintah yang awalnya Anda berikan ke wadah (/bin/bash
) akan dijalankan di latar belakang dan wadah tidak akan segera berhenti .sumber
CDR LDN
menjadicdrev
untuk jawaban di bawah ini ( stackoverflow.com/a/26181666/149428 ).-it
?Wadah Anda akan keluar karena perintah yang Anda berikan akan berakhir. Gunakan opsi berikut untuk tetap aktif:
-i
Tetap buka STDIN meskipun tidak terpasang.-t
Alokasikan pseudo-TTY.Jadi
run
perintah baru Anda adalah:Jika Anda ingin melampirkan wadah yang sudah berjalan:
Dalam contoh
/bin/bash
ini digunakan sebagai perintah.sumber
docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR"
dan mencetak variabel kosong (diharapkan1
). Apa yang saya lewatkan?-it
tidak tersedia.Jadi saya pikir jawabannya lebih sederhana daripada banyak jawaban menyesatkan di atas.
Untuk memulai wadah yang sudah ada yang dihentikan
Untuk menghentikan wadah yang sedang berjalan
Kemudian untuk login ke shell interaktif wadah
Untuk memulai wadah yang ada dan melampirkannya dalam satu perintah
Hati-hati, ini akan menghentikan wadah saat keluar. Tetapi secara umum, Anda harus memulai wadah, pasang dan hentikan setelah Anda selesai.
sumber
Untuk memperluas jawaban katrmr, jika wadah dihentikan dan tidak dapat dimulai karena kesalahan, Anda harus
commit
membawanya ke gambar. Kemudian Anda dapat meluncurkan bash di gambar baru:sumber
dshell
untuk melakukannya secara otomatis dalam berbagai situasi - github.com/avirshup/docker-cli-sugarBeberapa jawaban di sini menyesatkan karena menyangkut kontainer yang sedang berjalan, bukan berhenti.
Sven Dowideit menjelaskan di forum Docker bahwa kontainer terikat dengan proses mereka (dan Docker tidak dapat mengubah proses dari kontainer yang dihentikan, tampaknya setidaknya disebabkan oleh struktur internalnya: https://github.com/docker/docker/issues / 1437 ). Jadi, pada dasarnya satu-satunya pilihan adalah ke
commit
wadah dan gambarrun
dengan perintah yang berbeda.Lihat https://forums.docker.com/t/run-command-in-stopped-container/343
(saya percaya pendekatan "
ENTRYPOINT
dengan argumen" tidak akan berhasil, karena Anda masih tidak akan dapat mengubah argumen ke wadah yang dihentikan.)sumber
bin/bash
tanpa-it
tidak akan mengubah apa pun dalam wadah, jadi melakukan itu tidak benar-benar diperlukan dan CDR LDN memberikan jawaban yang tepat untuk situasi khusus OP. Namun,commit
adalah jawaban untuk masalah teknis tentang cara mengubah proses wadah.Saya harus menggunakan bash -c untuk menjalankan perintah saya:
docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"
sumber
Membuat wadah dan mengirim perintah kepadanya, satu per satu:
sumber
Ini adalah jawaban gabungan yang saya buat menggunakan jawaban LDN CDR di atas dan jawaban yang saya temukan di sini .
Contoh berikut memulai wadah Arch Linux dari gambar, dan kemudian menginstal
git
pada wadah itu menggunakanpacman
alat:Itu semuanya.
sumber
Jika Anda mencoba menjalankan skrip shell, Anda perlu menjalankannya sebagai bash.
sumber
Pipa perintah ke stdin
Harus menghapus
-t
agar berfungsi:Ini kadang lebih nyaman jika menggunakan opsi CLI.
Diuji dengan:
lalu pada shell lain:
Kemudian pada shell pertama:
Diuji pada Docker 1.13.1, host Ubuntu 16.04.
sumber
Dengan asumsi gambar menggunakan titik masuk default
/bin/sh -c
, menjalankan/bin/bash
akan segera keluar dalam mode daemon (-d
). Jika Anda ingin wadah ini menjalankan shell interaktif, gunakan-it
sebagai ganti-d
. Jika Anda ingin menjalankan perintah sewenang-wenang dalam sebuah wadah yang biasanya menjalankan proses lain, Anda mungkin ingin mencobansenter
ataunsinit
. Lihat https://blog.codecentric.de/en/2014/07/enter-docker-container/ untuk detailnya.sumber
Sayangnya tidak mungkin untuk menimpa
ENTRYPOINT
dengan argumen dengandocker run --entrypoint
untuk mencapai tujuan ini.sumber
Saya ingin mencatat bahwa jawaban teratas sedikit menyesatkan.
Masalah dengan eksekusi
docker run
adalah bahwa wadah baru dibuat setiap saat. Namun, ada beberapa kasus di mana kami ingin mengunjungi kembali wadah lama atau tidak menghabiskan ruang dengan wadah baru.(Diberikan
clever_bardeen
adalah nama wadah yang dibuat ...)Dalam kasus OP, pastikan gambar buruh pelabuhan pertama kali berjalan dengan menjalankan perintah berikut:
Kemudian, jalankan wadah buruh pelabuhan menggunakan perintah berikut:
sumber
Untuk Mac:
jika Anda ingin terhubung sebagai pengguna root:
sumber
Jawaban sederhana: mulai dan lampirkan secara bersamaan. Dalam hal ini Anda melakukan persis apa yang Anda minta.
pastikan untuk berubah
<CONTAINER_ID/CONTAINER_NAME>
sumber
Ex:
sumber
Saya menjalankan wadah windows dan saya perlu melihat ke dalam wadah buruh pelabuhan untuk file dan folder yang dibuat dan disalin.
Untuk melakukan itu, saya menggunakan perintah entry docker berikut untuk mendapatkan command prompt berjalan di dalam wadah atau melampirkan ke wadah.
Itu membantu saya untuk command prompt melampirkan wadah dan menjaga wadah tetap hidup. :)
sumber
Cara cepat untuk melanjutkan dan mengakses wadah yang terakhir keluar:
sumber
Saya biasanya menggunakan ini:
untuk terus berinteraksi dengan wadah yang sedang berjalan.
sumber