Saya memiliki buruh pelabuhan dengan perangkat lunak yang diinstal dan dikonfigurasi.
Tidak ada program apa pun yang seharusnya dimulai / dijalankan sepanjang waktu.
Apa yang saya inginkan - kemampuannya untuk memulai beberapa perintah tergantung pada peristiwa eksternal. seperti:
docker exec mysupercont /path/to/mycommand -bla -for
dan
docker exec mysupercont /path/to/myothercommand
Tetapi "exec" tidak mungkin ketika container dihentikan, dan juga container ini memiliki beberapa data "berfungsi", yang digunakan untuk perintah itu, jadi saya tidak bisa menggunakan
docker run ...
setiap kali, karena itu menciptakan wadah dari gambar dan menghancurkan data saya.
Apa cara "benar" dan "terbaik" untuk menjaga wadah seperti itu dijalankan? Perintah mana yang bisa saya mulai di dalam?
docker run -d --name=name container tail -f /dev/null
Jawaban:
Anda tidak perlu melakukan setiap kali
docker run
.docker run
sebenarnya adalah urutan dari dua perintah: "buat" dan "mulai".Saat Anda menjalankan wadah, Anda harus menentukan "
-it
":Contoh:
Setelah pekerjaan selesai, perintah yang ditentukan saat startup (dalam contoh saya bash). Misalnya, Anda melakukan "keluar". Kontainer berhenti:
Sekarang kamu bisa memulainya lagi
Kontainer dimulai dan sekali lagi menjalankan perintah "bash".
Hubungkan ke sesi ini "bash" dengan perintah
Singkatnya : Anda harus memahami perbedaan antara wadah
run
danstart
.Selain itu, lihat dokumentasi untuk peran parameter "
-i t
" dan "-d
" untuk "Run"sumber
docker attach ID
. Keluar dari sesi ini tanpa mengakhiri bash, Anda dapat menggunakanCTRL-p CTRL-q
Seluruh bisnis apakah Anda dapat memulai wadah yang dihentikan atau tidak, tergantung pada bagaimana wadah itu awalnya dibuat, yaitu dijalankan. Jika Anda menjalankan perintah yang berakhir, atau Anda keluar dari perintah interaktif, misalnya bash, Anda tidak dapat memulai, memulai kembali atau mengeksekusi wadah yang dihentikan. Yang bisa Anda lakukan adalah menghapusnya. Ini sampah.
Tapi komentar terakhir taranaki, gunakan '-itd', sepertinya itu yang diperintahkan buruh pelabuhan.
Wadah terus berjalan, dan Anda dapat mengeksekusi apa pun yang Anda inginkan, dan Anda dapat berhenti, memulai atau memulai kembali wadah. Tentu saja, ini hanya temuan awal berdasarkan gambar alpine. Catatan, jika Anda melampirkan wadah, itu akan berhenti ketika Anda keluar, tetapi Anda bisa memulainya lagi.
sumber
Karena Anda menyebutkan tugas-tugas berkala dan Anda mungkin menggunakan sesuatu seperti cron karena cara yang ingin Anda gunakan
docker exec
, saya hanya punya obat untuk Anda. Setidaknya saya akhirnya melakukan sesuatu seperti ini.Dockerfile
Jalankan dengan yang biasa
docker run -d ....
(saya duludocker-compose
)Siapkan mesin host crontab, misalnya:
Saya menemukan solusi ini bagus karena kita bisa mengandalkan crontab kuno dan terbukti di lingkungan linux yang cukup standar, sementara Docker menangani deps logika bisnis Anda dan variabel lingkungan yang lebih eksotis. Anda juga dapat menetapkan beberapa batasan jika tugas berkala Anda macet & kebocoran memori atau apa pun.
sumber
Tail akan tetap menyebabkan beberapa operasi file dari waktu ke waktu.
Ini solusi saya untuk tidur selamanya, tanpa efek samping.
Bagaimana itu bekerja
sumber