Eu tenho um VPS de uso geral e estou Dockerising os aplicativos nele. Haverá cerca de 5-6 contêineres e muito pouco mais, para que a caixa possa ser reconstruída trivialmente conforme necessário.
Para cada aplicativo, Tenho um script de início. Um contêiner WordPress se parece com isso:
#!/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
No entanto, isso retorna um erro:
Opções conflitantes: -- restart e -- rm
Existem vários tickets Docker que dizem que isso é sensato, mas não entendo. Acho que meu significado está claro: se um contêiner não estiver em execução (por exemplo, na inicialização), quero iniciá-lo. Se morrer, espero que o contêiner seja removido e um novo novo criado a partir da imagem base. Os contêineres devem ser imutáveis de qualquer maneira-qualquer estado que desejo preservar, como arquivos de mídia e logs, será gravado em volumes.
Então, eu pensei que deveria largar o --restart
sinalize e, em seguida, use um gerenciador de processos para interromper e iniciar contêineres do Docker. Posso usar o Monit aqui? Eu esperava poder fazer algo como:
CHECK PROCESS jonblog MATCHING jonblog START PROGRAM = "/root/docker/jonblog/host-start.sh" STOP PROGRAM = "docker stop jon-blog"
No entanto, isso verifica a tabela de processos do sistema e não docker ps
, e assim não encontrará algo que corresponda à string especificada. Posso obtê-lo para exec docker ps
periodicamente, e combinar linhas na saída?
Eu ficaria feliz em usar outra ferramenta se ela se mostrar robusta. Por exemplo, acho o Supervisor um pouco pesado, mas se isso for mais capaz de trabalhar com o Docker, estou disposto a usá-lo.
Esclarecimento sobre -- rm
A razão pela qual eu quero --rm
é que durante o processo de Dockerização, paro o contêiner atualmente em execução, load
uma nova versão da imagem e execute novamente o script acima. Isso significa que o Docker está sendo notificado de um restart
política para cada contêiner. Descobri que depois de reiniciar a caixa, eu teria 15 ou mais versões ligeiramente diferentes do aplicativo em execução simultaneamente, o que não é a intenção.
Suponho que eu poderia usar docker update --restart never
em contêineres antigos para evitar que isso aconteça, mas quando meu contêiner para, fico com ele por perto e logo o faço excluir automaticamente. Eu poderia limpar periodicamente os antigos usando algum tipo de trabalho cron, mas isso parece um pouco hacky, já que o Docker pode fazer isso por mim.
Buscando uma gama de respostas
Um comentário muito útil sugeriu que eu deveria examinar o Minikube, que aparentemente simplifica a configuração do Kubernetes, mesmo que um indivíduo adequadamente qualificado possa estar instalado e funcionando em cinco minutos.
Eu ainda gostaria de ver soluções mais leves propostas, então tenho uma série de respostas para escolher. Como indicado, gostaria de descobrir a resposta para saber se um supervisor de processo como o Monit funcionaria.
Fora do topo da minha cabeça, eu poderia escrever um loop de shell para escrever docker ps
para um arquivo a cada cinco segundos por um minuto e, em seguida, execute-o em um Cron a cada minuto. Eu poderia então verificar esse arquivo usando grep
e o Monit CHECK PROGRAM
verificação do sistema. Isso é um pouco hacky, mas é algo que eu posso entender facilmente se houver um problema com ele. Algum avanço nessa sugestão?