Menurut tutorial yang saya baca sejauh ini, gunakan " docker run -d
" akan memulai sebuah wadah dari gambar, dan wadah itu akan berjalan di latar belakang. Begini tampilannya, kita bisa melihat kita sudah memiliki id kontainer.
root@docker:/home/root# docker run -d centos
605e3928cdddb844526bab691af51d0c9262e0a1fc3d41de3f59be1a58e1bd1d
Tetapi jika saya berlari " docker ps
", tidak ada yang dikembalikan.
Jadi saya mencoba " docker ps -a
", saya dapat melihat wadah sudah keluar:
root@docker:/home/root# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
605e3928cddd centos:latest "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago kickass_swartz
Adakah yang saya lakukan salah? Bagaimana saya bisa memecahkan masalah ini?
docker run -it -d <image> /bin/bash
ini memulai bash shell secara interaktif dan tidak menutup wadah karena proses shell aktif.Jawaban:
The CentOS dockerfile memiliki perintah default
bash
.Itu berarti, ketika dijalankan di latar belakang (
-d
), shell segera keluar.Perbarui 2017
Versi terbaru dari buruh pelabuhan mengizinkan untuk menjalankan wadah baik dalam mode terpisah dan dalam mode latar depan (
-t
,-i
atau-it
)Dalam hal ini, Anda tidak memerlukan perintah tambahan dan ini sudah cukup:
Pesta akan menunggu di latar belakang.
Yang awalnya dilaporkan di kalyani-chaudhari 's jawaban dan rinci dalam jersey kacang ' s jawaban .
Perhatikan bahwa untuk alpine , Marinos An melaporkan dalam komentar :
Jawaban asli (2015)
Seperti disebutkan dalam artikel ini :
Jadi ini akan berhasil:
A
docker ps
akan menunjukkan wadah centos masih berjalan.Dari sana, Anda dapat melampirkan atau melepaskannya (atau
docker exec
beberapa perintah).sumber
docker exec -it <yourContainer> bash
.Menurut jawaban ini , menambahkan
-t
bendera akan mencegah wadah keluar saat berjalan di latar belakang. Anda kemudian dapat menggunakandocker exec -i -t <image> /bin/bash
untuk masuk ke prompt shell.Tampaknya opsi -t tidak didokumentasikan dengan baik , meskipun bantuan mengatakan bahwa "mengalokasikan pseudo-TTY."
sumber
tail -f /dev/null
docker run -t -d --name mysql -p 3306:3306 mysql
- tidak bekerja untuk saya (ubuntu 14.04.5): STATUS = Keluar (1) 4 detik yang laluLatar Belakang
Wadah Docker menjalankan proses ("perintah" atau "titik masuk") yang membuatnya tetap hidup. Kontainer akan terus berjalan selama perintah terus berjalan.
Dalam kasus Anda, perintah (
/bin/bash
, secara default, aktifcentos:latest
) segera keluar (seperti yang dilakukan bash ketika tidak terhubung ke terminal dan tidak ada yang dijalankan).Biasanya, ketika Anda menjalankan sebuah wadah dalam mode daemon (dengan
-d
), wadah menjalankan semacam proses daemon (sepertihttpd
). Dalam hal ini, selama daemon httpd berjalan, wadah akan tetap hidup.Apa yang Anda coba lakukan adalah menjaga wadah tetap hidup tanpa proses daemon berjalan di dalam wadah. Ini agak aneh (karena wadah tidak melakukan sesuatu yang berguna sampai Anda berinteraksi dengannya, mungkin dengan
docker exec
), tetapi ada beberapa kasus di mana masuk akal untuk melakukan sesuatu seperti ini.(Apakah Anda bermaksud untuk mendapatkan bash prompt di dalam wadah? Itu mudah!
docker run -it centos:latest
)Larutan
Cara sederhana untuk menjaga wadah tetap hidup dalam mode daemon tanpa batas adalah dengan menjalankannya
sleep infinity
sebagai perintah penampung. Ini tidak mengandalkan melakukan hal-hal aneh seperti mengalokasikan TTY dalam mode daemon. Meskipun tidak mengandalkan melakukan hal-hal aneh seperti menggunakansleep
sebagai perintah utama Anda.Solusi alternatif
Seperti yang ditunjukkan oleh cjsimon,
-t
opsi mengalokasikan "pseudo-tty". Trik ini gagal terus berjalan tanpa batas karena dianggap terhubung ke TTY interaktif (meskipun Anda tidak memiliki cara untuk berinteraksi dengan TTY tertentu jika Anda tidak lulus-i
). Bagaimanapun, ini harus melakukan trik juga:Tidak 100% yakin apakah
-t
akan menghasilkan interaksi aneh lainnya; mungkin tinggalkan komentar di bawah jika ya.sumber
infinity
.Hai masalah ini karena wadah buruh pelabuhan keluar jika tidak ada aplikasi yang berjalan di dalam wadah.
opsi hanya menjalankan wadah dalam mode deamon.
Jadi trik untuk membuat wadah Anda terus berjalan adalah arahkan ke file shell di docker yang akan membuat aplikasi Anda tetap berjalan. Anda dapat mencoba dengan file start.sh
Start.sh ini harus mengarah ke aplikasi yang tidak pernah berakhir.
Jika Anda tidak ingin aplikasi apa pun berjalan, Anda dapat menginstal
monit
yang akan membuat wadah buruh pelabuhan Anda tetap berjalan. Beri tahu kami jika kedua kasing ini berfungsi agar wadah Anda tetap beroperasi.Semua yang terbaik
sumber
Anda dapat mencapai apa yang Anda inginkan dengan:
atau
atau
Parameter perintah seperti yang disarankan oleh jawaban lain (mis. Tail -f / dev / null) sepenuhnya opsional, dan TIDAK diperlukan untuk membuat wadah Anda tetap berjalan di latar belakang.
Perhatikan juga dokumentasi Docker menyarankan bahwa menggabungkan opsi -i dan -t akan membuatnya berperilaku seperti shell.
Lihat:
https://docs.docker.com/engine/reference/run/#foreground
sumber
Saya menjalankan potongan kode ini dari
ENTRYPOINT
dalam file docker saya:Jalankan gambar buruh pelabuhan yang dibangun sebagai:
Masuk ke shell kontainer:
sumber
jalankan perintah sebagai berikut:
jika Anda ingin menentukan port maka perintah seperti di bawah ini:
verifikasi wadah berjalan menggunakan perintah berikut:
sumber
-t -d
vs-i -d
? Keduanya akan menjaga wadah tetap berjalan.Docker membutuhkan perintah Anda untuk terus berjalan di latar depan. Kalau tidak, ia berpikir bahwa aplikasi Anda berhenti dan mematikan wadah.
Jadi jika skrip entri buruh pelabuhan Anda adalah proses latar belakang seperti berikut:
Tanda '&' membuat wadah berhenti dan keluar jika tidak ada proses latar depan lain yang dipicu nanti. Jadi solusinya hanya menghapus '&' atau memiliki CMD foreground lain setelahnya , seperti
sumber
touch
file itu dulu, kalau-kalau Anda tidak dapat menemukan file log.Wadah Docker keluar jika tugas di dalamnya selesai, jadi jika Anda ingin tetap hidup meskipun tidak memiliki pekerjaan atau sudah menyelesaikannya, Anda dapat melakukannya
docker run -di image
. Setelah Anda melakukannya,docker container ls
Anda akan melihatnya berjalan.sumber
Mungkin hanya saya tetapi pada CentOS 7.3.1611 dan Docker 1.12.6 tetapi saya akhirnya harus menggunakan kombinasi jawaban yang diposting oleh @VonC & @Christopher Simon untuk mendapatkan pekerjaan ini dengan andal. Tidak ada yang saya lakukan sebelum ini akan menghentikan wadah keluar setelah menjalankan CMD dengan sukses. Saya memulai oracle-xe-11Gr2 dan sshd.
Dockerfile
Kemudian tambahkan -d -t dan -i untuk dijalankan
Akhirnya setelah berjam-jam memukul kepala saya ke dinding
Untuk alasan apa pun di atas akan keluar setelah mengeksekusi CMD jika tail -f dihapus, atau opsi -t -d -i dihilangkan.
sumber
Saya telah menjelaskannya di posting berikut yang memiliki pertanyaan yang sama.
Bagaimana cara mempertahankan kontainer alpine buruh pelabuhan setelah "keluar" digunakan?
sumber
Saya memiliki masalah yang sama, hanya membuka terminal lain dengan bash di atasnya bekerja untuk saya:
buat wadah:
mulai wadah:
mulai bash untuk menjaga wadah berjalan:
mulai proses yang Anda butuhkan:
sumber
Jika Anda menggunakan CMD di akhir Dockerfile Anda, yang bisa Anda lakukan adalah menambahkan kode di akhir. Ini hanya akan berfungsi jika buruh pelabuhan Anda dibangun di ubuntu, atau OS apa pun yang dapat menggunakan bash.
Secara singkat ujung Dockerfile Anda akan terlihat seperti ini.
Jadi, jika Anda memiliki sesuatu yang berjalan secara otomatis setelah Anda menjalankan gambar buruh pelabuhan Anda, dan ketika tugas selesai terminal bash akan aktif di dalam buruh pelabuhan Anda. Dengan demikian, Anda dapat memasukkan perintah shell Anda.
sumber
Menjalankan buruh pelabuhan dengan mode interaktif mungkin menyelesaikan masalah.
Berikut adalah contoh untuk menjalankan gambar dengan dan tanpa mode interaktif
chaitra @ RSK-IND-BLR-L06: ~ / buruh pelabuhan $ sudo buruh pelabuhan menjalankan -d -t -i test_again1.0 b6b9a942a79b1243bada59db19c7999cfff52d0a8744542fa843c95354966a18
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
KOMANDA ID GAMBAR PERINTAH NAMA STATUS BUATAN STATUS
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker run -d -t -i test_again1.0 bash c3d6a9529fd70c5b2dc2d7e90fe662d19c6dad854999b8c812fb2b7ce2105d7ff5
chaitra @ RSK-IND-BLR-L06: ~ / dockers $ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c3d6a9529fd7 test_again1.0 "bash" 2 detik yang lalu Naik 1 detik awesome_haibt
sumber
jika Anda ingin beroperasi pada wadah, Anda harus menjalankannya di latar depan agar tetap hidup.
sumber
Urutan argumen penting
Jersey Beans answer (ketiga contoh) bekerja untuk saya. Setelah sedikit trial and error saya menyadari bahwa urutan argumen itu penting.
Membuat wadah tetap berjalan di latar belakang:
docker run -t -d <image-name>
Membuat wadah tetap berjalan di latar depan:
docker run <image-name> -t -d
Bagi saya tidak jelas berasal dari latar belakang Powershell.
sumber