Как я могу автоматически перезапустить свои контейнеры Docker с помощью автоматического удаления контейнера?

У меня есть ответ, который подходит для моего нынешнего понимания Docker. В комментариях мне посоветовали попробовать Minikube, и хотя, несомненно, это можно быстро раскрутить, я боялся, что это будет кроличья нора обучения, из-за которой я застряну в tar на несколько недель. Один из моих инженерных принципов - знать, когда человек достиг когнитивного предела для вброса новой информации!

Таким образом, я решил решить эту проблему простым способом. У меня было два варианта:

  1. Используйте функцию автоматического удаления контейнера в Docker и настройте мою собственную систему перезапуска
  2. Используйте политику перезапуска Docker и настройте мою собственную систему удаления контейнеров

Я начал с первого из них с идеи, что было бы неплохо использовать process supervisor Monit, отчасти потому, что он легкий, а отчасти потому, что я с ним знаком. Тем не менее, это начало казаться неправильным решением, поскольку я бы работал над основной проблемой, заключающейся в том, что он не может чисто получить список процессов контейнера Docker.

На самом деле, второй вариант был намного чище, и это усиливалось тем фактом, что очистка контейнера на самом деле не является приоритетом - это просто поддержание порядка. Конечно, я использовал для этого Docker; вот 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"]

И вот 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)

Наконец, одним из недостатков моего решения является то, что если хост перезагружается перед остановленной очисткой контейнера, эти контейнеры, похоже, также перезапускаются. Поэтому я сбрасываю политику перезапуска для этих контейнеров перед запуском новых.

Например, вот как я запускаю сам контейнер Docker Tidy на хосте. На практике я привел в порядок код изменения политики в его собственном скрипте, но это даст общее представление:

#!/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