Bagaimana Saya bisa secara otomatis me-restart kontainer Docker saya dengan kontainer auto-delete?

Saya memiliki VPS tujuan umum, dan saya Dockerising aplikasi di atasnya. Akan ada sekitar 5-6 kontainer di atasnya, dan sangat sedikit yang lain, sehingga kotak dapat dibangun kembali secara sepele sesuai kebutuhan.

Untuk setiap aplikasi saya memiliki skrip awal. Wadah WordPress terlihat seperti ini:

#!/bin/bash# Get the host IP addressexport DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"docker run \    --add-host=docker:${DOCKER_HOSTIP} \    --network dockernet \    --network-alias jonblog \    --detach \    --restart always \    --rm \    jonblog

Namun, itu mengembalikan kesalahan:

Opsi yang bertentangan: -- restart dan -- rm

Ada beberapa tiket Docker yang mengatakan ini masuk akal, tetapi saya tidak memahaminya. Saya pikir maksud saya jelas: jika sebuah wadah tidak berjalan (misalnya saat start-up) maka saya ingin memulainya. Jika mati maka saya berharap wadah akan dihapus, dan yang baru dibuat dari gambar dasar. Wadah harus tetap tidak dapat diubah - status apa pun yang ingin saya pertahankan, seperti file media dan log, akan ditulis ke volume.

Jadi, saya pikir saya harus menjatuhkan --restart bendera, dan kemudian menggunakan manajer proses untuk berhenti dan mulai Docker kontainer. Bisakah Saya menggunakan Monit di sini? Saya berharap bisa melakukan sesuatu seperti:

CHECK PROCESS jonblog MATCHING jonblog  START PROGRAM = "/root/docker/jonblog/host-start.sh"  STOP PROGRAM = "docker stop jon-blog"

Namun, yang memeriksa tabel proses sistem, dan tidak docker ps, sehingga tidak akan menemukan sesuatu yang cocok dengan string yang ditentukan. Bisakah saya mendapatkannya untuk exec docker ps berkala, dan Garis pertandingan dalam output?

Saya akan dengan senang hati menggunakan alat lain jika terbukti kuat. Sebagai contoh, saya menemukan Supervisor agak kelas berat, tetapi jika itu lebih mampu bekerja dengan Docker, saya bersedia menggunakannya.

Klarifikasi tentang -- rm

Alasan mengapa saya ingin --rm apakah selama proses Dockerisation, saya menghentikan container yang sedang berjalan, load sebuah versi baru dari gambar, dan kembali menjalankan script di atas. Ini berarti bahwa Docker sedang diberitahu tentang restart kebijakan untuk setiap kontainer. Saya menemukan bahwa setelah me-reboot kotak, saya akan memiliki 15 atau lebih versi aplikasi yang sedikit berbeda yang berjalan secara bersamaan, yang bukan maksudnya.

Saya kira saya bisa menggunakan docker update --restart never pada wadah lama untuk mencegah hal ini terjadi, tetapi kemudian ketika wadah saya berhenti, saya dibiarkan tergeletak di sekitar, dan saya akan segera menghapusnya secara otomatis. Saya dapat secara berkala membersihkan yang lama menggunakan semacam pekerjaan cron, tetapi itu terasa agak hacky mengingat Docker dapat melakukannya untuk saya.

Mencari berbagai jawaban

Komentar yang sangat membantu menyarankan agar saya melihat ke Minikube, yang tampaknya menyederhanakan pengaturan Kubernetes, bahkan sampai tingkat individu yang terampil dapat berdiri dan berjalan dalam lima menit.

Saya masih ingin melihat solusi yang lebih ringan Diusulkan, jadi saya memiliki berbagai jawaban untuk dipilih. Seperti yang ditunjukkan, saya ingin mengetahui jawaban apakah supervisor proses seperti Monit akan bekerja.

Dari atas kepala saya, saya bisa menulis loop shell untuk menulis docker ps untuk file setiap lima detik selama satu menit, dan kemudian jalankan bahwa pada Cron setiap menit. Saya kemudian dapat memindai file itu menggunakan grep dan Monit CHECK PROGRAM pemeriksaan sistem. Itu sedikit hacky, tetapi adalah sesuatu yang saya dapat mengerti dengan mudah jika ada masalah dengan itu. Ada kemajuan atas saran itu?

Saya Punya Jawaban yang cocok untuk pemahaman saya saat ini tentang Docker. Saya disarankan dalam komentar untuk mencoba Minikube, dan meskipun tidak diragukan lagi ini dapat diputar dengan cepat, saya khawatir ini akan menjadi lubang pembelajaran kelinci yang akan membuat saya terjebak dalam tar selama berminggu-minggu. Salah satu prinsip teknik saya adalah mengetahui kapan seseorang telah mencapai batas kognitif untuk memasukkan informasi baru!

Jadi, saya berangkat untuk menyelesaikan masalah ini dengan cara yang sederhana. Aku punya dua pilihan:

  1. Gunakan fitur Hapus otomatis penampung di Docker, dan atur sistem restart saya sendiri
  2. Gunakan kebijakan restart Docker, dan siapkan sistem penghapusan kontainer saya sendiri

Saya memulai yang pertama, dengan gagasan bahwa pengawas proses Monit akan menyenangkan untuk digunakan, sebagian karena ringan, dan sebagian karena saya mengenalnya. Namun, itu mulai terasa seperti solusi yang salah, karena saya akan mengatasi masalah inti sehingga tidak bisa mendapatkan daftar proses kontainer Docker dengan bersih.

Bahkan, pilihan kedua adalah jauh lebih bersih, dan ini diperkuat oleh fakta bahwa berhenti wadah bersih-bersih sebenarnya tidak prioritas - itu hanya untuk menjaga hal-hal rapi. Tentu saja, saya menggunakan Docker untuk ini; inilah Dockerfile:

# Docker build script for Docker TidyFROM alpine:3.6RUN apk updateRUN apk add docker# See this for BusyBox cron schedules# https://gist.github.com/andyshinn/3ae01fa13cb64c9d36e7COPY bin/docker-tidy.sh /etc/periodic/daily/RUN chmod +x /etc/periodic/daily/docker-tidy.sh# Start Cron in the foregroundENTRYPOINT ["crond", "-l", "2", "-f"]

Dan inilah bin/docker-tidy.sh:

#!/bin/sh## With thanks to:# http://www.doublecloud.org/2015/05/simple-script-to-list-and-remove-all-stopped-docker-containers/docker rm -v $(docker ps -a -q -f status=exited)

Akhirnya, satu kelemahan dengan solusi saya adalah bahwa jika host di-boot ulang sebelum pembersihan kontainer yang dihentikan, kontainer tersebut tampaknya juga dimulai ulang. Oleh karena itu saya mengatur ulang kebijakan restart pada wadah tersebut sebelum memulai yang baru.

Misalnya, inilah cara saya memulai wadah Docker Tidy itu sendiri, di host. Dalam praktiknya saya telah merapikan kode perubahan kebijakan menjadi skripnya sendiri, tetapi ini akan memberikan gambaran umum:

#!/bin/bash# Removes the restart policy from previous containersCONTAINER_LABEL=docker-tidy-instancedocker ps --all --filter label=$CONTAINER_LABEL --quiet | xargs --no-run-if-empty docker update --restart nodocker run \    --label $CONTAINER_LABEL \    --volume /var/run/docker.sock:/var/run/docker.sock \    --detach \    --restart always \    docker-tidy

Pergi bermain dengan Minikube Anda dapat memilikinya dalam waktu sekitar lima menit.

Cukup adil, @ Michael. Dapatkah saya melakukannya dengan Monit (atas dasar saya agak akrab dengannya)? Saya melihat di halaman manual, tapi itu adalah rakasa dari read, dan saya kehilangan keinginan untuk hidup ketika mengarungi itu. Saya bertanya-tanya, dari dokumen, apakah [pemeriksaan program] (Monit Manual) akan berhasil-jika saya dapat menyelinap parameter ke jalur yang dapat dieksekusi, itu dapat mengembalikan kesuksesan/gagal tergantung pada apakah wadah bernama sedang berjalan.

Mungkin ada cara yang lebih berorientasi pada buruh pelabuhan untuk melakukan ini, tetapi Pencarian Saya-fu tidak menemukan sesuatu yang sangat menarik.

Sejujurnya jika Anda sering membangun kembali kontainer, Anda harus menggunakan sesuatu seperti Kubernetes untuk mengelola berbagai hal.

Anda benar @ Michael ,dan saya akan menyelidikinya ketika saya punya waktu. Saya diberitahu oleh Sub buruh pelabuhan di Reddit bahwa Kube cukup usaha (meskipun berharga). Aku akan mencari sesuatu yang lebih mudah untuk saat ini, yang saya memiliki kesempatan grokking.

(Sebuah komentar di sini lima menit yang lalu, sekarang dihapus, mengatakan bahwa saya hanya perlu restart. Ya, ini akan berhasil, tetapi saya kemudian harus melepaskan --rm - saya dapat memiliki satu atau yang lain, tetapi tidak keduanya, mengingat kesalahan yang saya tunjukkan dalam pertanyaan. Lihat edit klarifikasi tentang mengapa saya pikir` – rm ’ diperlukan).

Tidak ada cara yang baik untuk membedakan antara keadaan saat Anda ingin penampung dimulai ulang dan keadaan saat Anda ingin penampung dihapus. Ini adalah sesuatu yang Anda butuhkan untuk menangani diri Anda di luar Docker.