Saya telah melihat banyak tutorial yang tampaknya melakukan hal yang sama yang saya coba lakukan, tetapi untuk beberapa alasan wadah Docker saya keluar. Pada dasarnya, saya membuat server web dan beberapa daemon di dalam wadah Docker. Saya melakukan bagian terakhir dari ini melalui skrip bash yang disebut run-all.sh
bahwa saya menjalankan melalui CMD di Dockerfile saya. run-all.sh
terlihat seperti ini:
service supervisor start
service nginx start
Dan saya memulainya di dalam Dockerfile saya sebagai berikut:
CMD ["sh", "/root/credentialize_and_run.sh"]
Saya dapat melihat bahwa semua layanan memulai dengan benar ketika saya menjalankan sesuatu secara manual (yaitu melanjutkan ke gambar dengan -i -t / bin / bash), dan semuanya terlihat berjalan dengan benar ketika saya menjalankan gambar, tetapi keluar sekali selesai memulai proses saya. Saya ingin proses berjalan tanpa batas, dan sejauh yang saya mengerti, wadah harus terus berjalan agar ini terjadi. Namun demikian, ketika saya berlari docker ps -a
, saya melihat:
➜ docker_test docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7706edc4189 some_name/some_repo:blah "sh /root/run-all.sh 8 minutes ago Exited (0) 8 minutes ago grave_jones
Apa yang menyebabkannya? Mengapa keluar? Saya tahu saya bisa meletakkan loop sementara di akhir skrip bash saya untuk mempertahankannya, tetapi apa cara yang benar untuk mencegahnya keluar?
Jawaban:
Ini tidak benar-benar bagaimana Anda harus merancang wadah Docker Anda.
Saat merancang wadah Docker, Anda seharusnya membuatnya sedemikian rupa sehingga hanya ada satu proses yang berjalan (yaitu Anda harus memiliki satu wadah untuk Nginx, dan satu untuk pengawas atau aplikasi yang dijalankannya); selain itu, proses itu harus berjalan di latar depan.
Wadah akan "keluar" ketika proses itu sendiri keluar (dalam kasus Anda, proses itu adalah skrip bash Anda).
Namun, jika Anda benar - benar perlu (atau ingin) menjalankan beberapa layanan dalam wadah Docker Anda, pertimbangkan mulai dari "Docker Base Image" , yang digunakan
runit
sebagai proses pseudo-init (runit
akan tetap online saat Nginx dan Supervisor berjalan), yang akan tetap ada di latar depan sementara proses Anda yang lain melakukan hal mereka.Mereka memiliki dokumen penting, jadi Anda harus dapat mencapai apa yang Anda coba lakukan dengan mudah.
sumber
--nodaemon
opsi.Jika Anda menggunakan Dockerfile, coba:
(Jelas ini hanya untuk keperluan dev, Anda tidak perlu membuat wadah tetap hidup kecuali itu menjalankan proses misalnya. Nginx ...)
sumber
CMD["sleep", "1d"]
tetapi solusi Anda tampaknya lebih baikCMD["sleep", "infinity"]
.exec tail -f /dev/null
tetapi menggunakantail
sebagai entri adalah jawaban yang salah.Saya baru saja mengalami masalah yang sama dan saya menemukan bahwa jika Anda menjalankan wadah Anda dengan bendera
-t
dan-d
, itu terus berjalan.Inilah yang dilakukan oleh bendera (menurut
docker run --help
):Yang paling penting adalah
-t
bendera.-d
hanya memungkinkan Anda menjalankan wadah di latar belakang.sumber
docker logs <image>
untuk memastikan itu adalah kesalahan yang menyebabkan buruh pelabuhan saya keluar. Status keluar adalah0
dan keluaran terakhir adalah konfirmasi bahwalighttpd
server saya sedang berjalan:[ ok ] Starting web server: lighttpd.
exec bash
atauexec sh
jika bash tidak diinstal, sampai akhir start.sh Kemudian Anda dapat menggunakan flag -tAlasan keluarnya adalah karena skrip shell dijalankan pertama kali sebagai PID 1 dan saat itu selesai, PID 1 hilang, dan buruh pelabuhan hanya berjalan sementara PID 1 sedang.
Anda dapat menggunakan penyelia untuk melakukan segalanya, jika dijalankan dengan bendera "-n" diperintahkan untuk tidak melakukan daemonisasi, jadi itu akan tetap sebagai proses pertama:
Dan supervisord.conf Anda:
Kemudian Anda dapat memiliki sebanyak mungkin proses lain yang Anda inginkan dan penyelia akan menangani proses restart jika diperlukan.
Dengan begitu Anda bisa menggunakan supervisord dalam kasus-kasus di mana Anda mungkin perlu nginx dan php5-fpm dan tidak masuk akal untuk memisahkannya.
sumber
If the "init" process of a PID namespace terminates, the kernel terminates all of the processes in the namespace via a SIGKILL signal. This behavior reflects the fact that the "init" process is essential for the correct operation of a PID namespace.
Anda dapat menjalankan
cat
perintah tanpa argumen seperti yang disebutkan oleh bro @ Sa'ad untuk menjaga agar wadah tetap berfungsi [sebenarnya tidak melakukan apa-apa selain menunggu input pengguna] (plugin Docker Jenkins melakukan hal yang sama)sumber
cat
. Plugin docker jenkin melakukannya.Pastikan Anda menambahkan
daemon off;
nginx.conf kepada Anda atau menjalankannyaCMD ["nginx", "-g", "daemon off;"]
sesuai dengan gambar nginx resmiKemudian gunakan berikut ini untuk menjalankan kedua pengawas sebagai layanan dan nginx sebagai proses latar depan yang akan mencegah wadah keluar
service supervisor start && nginx
Dalam beberapa kasus, Anda perlu memiliki lebih dari satu proses dalam wadah Anda, jadi memaksa wadah untuk memiliki satu proses yang tepat tidak akan bekerja dan dapat menciptakan lebih banyak masalah dalam penyebaran.
Jadi, Anda perlu memahami pertukaran dan membuat keputusan yang sesuai.
sumber
Motivasi:
Tidak ada yang salah dalam menjalankan banyak proses di dalam wadah buruh pelabuhan . Jika seseorang suka menggunakan buruh pelabuhan sebagai VM ringan - baiklah. Yang lain suka membagi aplikasi mereka menjadi layanan mikro. Saya berpikir: Tumpukan LAMP dalam satu wadah? Bagus sekali.
Jawabannya:
Tetap dengan gambar dasar yang bagus seperti gambar dasar phusion . Mungkin ada yang lain. Tolong beri komentar anda.
Dan ini hanyalah sekadar permohonan untuk atasan. Karena gambar dasar phusion menyediakan pengawas selain beberapa hal lain seperti cron dan pengaturan lokal. Hal-hal yang ingin Anda siapkan saat menjalankan VM yang ringan. Untuk apa itu layak juga menyediakan koneksi ssh ke dalam wadah.
Gambar phusion itu sendiri hanya akan mulai dan terus berjalan jika Anda mengeluarkan pernyataan run docker dasar ini:
Atau mati sederhana:
Jika gambar dasar bukan untuk Anda ... Untuk CMD cepat agar tetap berjalan saya kira sesuatu seperti ini untuk bash:
Atau ini untuk busybox:
Ini bagus, karena akan segera keluar pada a
docker stop
. Biasasleep
ataucat
akan memakan waktu beberapa detik sebelum wadah keluar.sumber
Tangkap PID dari proses ngnix dalam sebuah variabel (misalnya $ NGNIX_PID) dan pada akhir file entry point lakukan
Dengan cara itu, wadah Anda harus berjalan sampai ngnix hidup, ketika ngnix berhenti, wadah juga berhenti
sumber
Bagaimana jika menggunakan bentuk layanan pengawasan jika tersedia?
layanan YOUR_SERVICE mengawasi
Menghemat harus membuat
supervisord.conf
sumber