Eu tenho o contêiner docker com software instalado e configurado.
Não há nenhum programa que deve ser iniciado/executado o tempo todo.
O que eu quero - sua capacidade de iniciar algum comando dependendo de eventos externos. Curti:
docker exec mysupercont /path/to/mycommand -bla -for
e
docker exec mysupercont /path/to/myothercommand
Mas "exec" é impossível quando o contêiner está parado, e também esse contêiner tem alguns dados "de trabalho" dentro, que são usados para esses comandos, então não posso usar
docker run ...
cada vez, porque recria o contêiner da imagem e destrói meus dados.
Qual é a maneira "certa" e "melhor" de manter esse contêiner funcionando? Qual comando eu posso iniciar dentro?
Você não precisa executar todas as vezes
docker run
.docker run
é na verdade uma sequência de dois comandos: "criar" e "iniciar".Ao executar o contêiner, você deve especificar o "
-it
":Exemplo:
Depois que o trabalho foi concluído, o comando especificado na inicialização (no meu exemplo bash). Por exemplo, você executa a "saída". Paradas de contêiner:
Agora você pode iniciá-lo novamente
O container é iniciado e novamente executa o comando "bash".
Conecte-se a esta sessão "bash" com o comando
Resumindo : você tem que entender a diferença entre o
run
estart
container.Além disso, veja a documentação para o papel dos parâmetros "
-i t
" e "-d
" para o "Run"Como você mencionou tarefas periódicas e provavelmente está usando algo como cron por causa da maneira que deseja usar
docker exec
, tenho apenas o remédio para você. Pelo menos acabei fazendo algo assim.Dockerfile
Corra com o usual
docker run -d ....
(eu useidocker-compose
)Configure o crontab das máquinas host, por exemplo:
Acho essa solução boa, pois podemos confiar no crontab antigo e comprovado em um ambiente linux bastante padrão, enquanto o Docker lida com as dependências e variáveis de ambiente mais exóticas da sua lógica de negócios. Você também pode definir alguns limites se suas tarefas periódicas ficarem presas e tiverem vazamentos de memória ou qualquer outra coisa.
O Tail ainda causará algumas operações de arquivo de tempos em tempos.
Durma para sempre, sem efeitos colaterais
Como funciona
Todo esse negócio de se você pode ou não iniciar um container parado, depende de como o container foi criado originalmente, ou seja, executado. Se você executou um comando que terminou ou saiu de um comando interativo, por exemplo, bash, você não pode iniciar, reiniciar ou executar o contêiner parado. Tudo o que você pode fazer é removê-lo. É lixo.
Mas o último comentário de taranaki, use '-itd', parece ser o que o docker ordenou.
O container continua rodando, e você pode executar o que quiser, e você pode parar, iniciar ou reiniciar o container. Claro, esta é apenas uma descoberta preliminar baseada na imagem alpina. Observe que, se você anexar ao contêiner, ele será interrompido quando você sair, mas você poderá iniciá-lo novamente.
Eu mesmo usei todas as soluções propostas aqui, mas todas elas não lidam com sinais SIGTERM vindos do daemon do Docker quando ele deseja encerrar o contêiner (por exemplo
docker stop $containername
, ).Então proponho o seguinte:
É basicamente um script de shell curto que primeiro intercepta ("armadilhas") sinais SIGTERM e depois entra em suspensão por um segundo em um loop infinito.
Eu uso principalmente junto com docker-compose e ofelia para fornecer contêineres side-car para fazer backup de algum outro serviço em outro contêiner (por exemplo, bancos de dados MariaDB).