У меня есть ответ, который подходит для моего нынешнего понимания Docker. В комментариях мне посоветовали попробовать Minikube, и хотя, несомненно, это можно быстро раскрутить, я боялся, что это будет кроличья нора обучения, из-за которой я застряну в tar на несколько недель. Один из моих инженерных принципов - знать, когда человек достиг когнитивного предела для вброса новой информации!
Таким образом, я решил решить эту проблему простым способом. У меня было два варианта:
- Используйте функцию автоматического удаления контейнера в Docker и настройте мою собственную систему перезапуска
- Используйте политику перезапуска 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