Cara yang tepat untuk menjaga wadah buruh pelabuhan dimulai ketika digunakan untuk tugas-tugas berkala

41

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?

Korjavin Ivan
sumber
Ini adalah pertanyaan yang dijelaskan dengan sangat baik. Lihat posting serupa lainnya di sini .
Berikan Li
1
docker run -d --name=name container tail -f /dev/null
dikemudikan

Jawaban:

46

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":

-i, --interactive = false Biarkan STDIN tetap terbuka meskipun tidak terpasang
-t, --tty = false Alokasikan a pseudo-TTY

Contoh:

docker run -it debian:stable bash

Setelah pekerjaan selesai, perintah yang ditentukan saat startup (dalam contoh saya bash). Misalnya, Anda melakukan "keluar". Kontainer berhenti:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES
1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

Sekarang kamu bisa memulainya lagi

docker start 1329c99a831b

Kontainer dimulai dan sekali lagi menjalankan perintah "bash".
Hubungkan ke sesi ini "bash" dengan perintah

docker attach 1329c99a831b

Singkatnya : Anda harus memahami perbedaan antara wadah rundan start.
Selain itu, lihat dokumentasi untuk peran parameter " -i t" dan " -d" untuk "Run"

MSemochkin
sumber
1
aha, aku mengerti ini. Pertanyaannya adalah: Saya tidak punya apa-apa untuk dijalankan di dalam wadah, tetapi saya harus menyimpannya dalam keadaan "jalankan". Jadi jawaban Anda adalah - gunakan bash untuk menyimpan wadah dalam keadaan berjalan?
Korjavin Ivan
Ya. Proses yang Anda tentukan pada waktu menjalankan harus berjalan ke wadah terus bekerja. Contoh paling sederhana adalah bash. Mungkin Anda akan menjadi cara termudah untuk memulai wadah dengan "-d" dan terhubung dengannya sesuai kebutuhan menggunakan docker attach ID. Keluar dari sesi ini tanpa mengakhiri bash, Anda dapat menggunakanCTRL-p CTRL-q
MSemochkin
Proses yang Anda tentukan selama menjalankan wadah menerima PID 1. Oleh karena itu, wadah tidak dapat berfungsi tanpanya ☺
MSemochkin
Pengalaman saya dengan mulai dan melampirkan (atau mulai dengan -ai) adalah bahwa pengeditan prompt dan interaktif dari baris perintah Anda tidak muncul. EG tty tidak menampilkan atau menggema.
dlamblin
1
Ini bagus. Perhatikan bahwa jika Anda ingin memulai wadah di latar belakang tanpa harus memulainya lagi secara manual (katakanlah jika Anda menjalankan layanan web), gunakan parameter '-itd', dan CTRL-p CTRL-q untuk melepaskan tanpa menghentikan wadah.
taranaki
6

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.

Sue Parker
sumber
3
+1 "tampaknya seperti yang diperintahkan buruh pelabuhan" :-)
Matt Alexander
5

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.

  1. Dockerfile

    FROM <some base>
    CMD tail -f /dev/null
    
  2. Jalankan dengan yang biasa docker run -d ....(saya dulu docker-compose)

  3. Siapkan mesin host crontab, misalnya:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1
    * * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1
    

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.

elnygren
sumber
0

Tail akan tetap menyebabkan beberapa operasi file dari waktu ke waktu.

Ini solusi saya untuk tidur selamanya, tanpa efek samping.

# Ah, ha, ha, ha, stayin' alive...
while true; do :; done & kill -STOP $! && wait $!

Bagaimana itu bekerja

while true; do :; done & # do nothing(:) in background, in an endless loop
kill -STOP $!            # stop the background process of doing nothing
wait $!                  # wait forever, because doing nothing process is stopped
qoomon
sumber
1
sulit untuk memahami apa yang dilakukannya. mengapa tidak tidur saja 3650d
Pieter
1
Anda benar, tidur mungkin akan bekerja sebaik solusi saya, namun akhirnya tidur akan habis :-D PS: Saya akan menambahkan beberapa komentar, untuk membuat solusi saya mudah dimengerti.
qoomon