Eu tenho uma resposta adequada para meu entendimento atual do Docker. Fui aconselhado nos comentários a experimentar o Minikube e, embora, sem dúvida, isso possa ser resolvido rapidamente, temi que isso fosse uma lição de aprendizado que me deixaria preso no tar durante semanas. Um dos meus princípios de engenharia é saber quando alguém atingiu um limite cognitivo para encher novas informações!
Assim, resolvi resolver esse problema de maneira simples. Eu tinha duas escolhas:
- Use o recurso de exclusão automática do contêiner no Docker e configure meu próprio sistema de reinicialização
- Use a política de reinicialização do Docker e configure meu próprio sistema de exclusão de contêiner
Comecei no primeiro deles, com a ideia de que o supervisor de processos Monit seria bom de usar, em parte porque é leve, e em parte porque eu estou familiarizado com isso. No entanto, ele começou a parecer a solução errada, já que eu estaria trabalhando em torno do problema principal que não é possível obter uma lista de processos contêineres do Docker.
Na verdade, a segunda opção foi muito mais limpa, e isso foi amplificado pelo fato de que a limpeza do contêiner parado não é realmente uma prioridade - é apenas para manter as coisas arrumadas. Claro, eu usei o Docker para isso; aqui está o Dockerfile
:
# Docker build script for Docker Tidy
FROM alpine:3.6
RUN apk update
RUN apk add docker
# See this for BusyBox cron schedules
# https://gist.github.com/andyshinn/3ae01fa13cb64c9d36e7
COPY bin/docker-tidy.sh /etc/periodic/daily/
RUN chmod +x /etc/periodic/daily/docker-tidy.sh
# Start Cron in the foreground
ENTRYPOINT ["crond", "-l", "2", "-f"]
E aqui está o 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)
Por fim, uma desvantagem da minha solução é que, se o host for reinicializado antes de uma limpeza do contêiner parado, esses contêineres também parecem reiniciar. Por isso, redefino a política de reinicialização nesses contêineres antes de iniciar novos contêineres.
Por exemplo, aqui está como inicio o próprio contêiner do Docker Tidy, no host. Na prática, eu arrumei o código de mudança de política em seu próprio script, mas isso dará uma ideia geral:
#!/bin/bash
# Removes the restart policy from previous containers
CONTAINER_LABEL=docker-tidy-instance
docker ps --all --filter label=$CONTAINER_LABEL --quiet | xargs --no-run-if-empty docker update --restart no
docker run \
--label $CONTAINER_LABEL \
--volume /var/run/docker.sock:/var/run/docker.sock \
--detach \
--restart always \
docker-tidy