Eu tenho contêiner de docker com software instalado e configurado.
Não existe nenhum programa que deva ser iniciado / executado o tempo todo.
O que eu quero - sua capacidade de iniciar algum comando, dependendo de eventos externos. gostar:
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 contém alguns dados "funcionais", que são usados para esses comandos, então não posso usar
docker run ...
sempre, porque recriar contêiner a partir da imagem e destruir meus dados.
Qual é a maneira "certa" e "melhor" de manter esse contêiner em funcionamento? Qual comando posso iniciar por dentro?
docker run -d --name=name container tail -f /dev/null
Respostas:
Você não precisa executar todas as vezes
docker run
.docker run
é na verdade uma sequência de dois comandos: "create" e "start".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". O contêiner para:
Agora você pode iniciá-lo novamente
O contêiner é iniciado e novamente executa o comando "bash".
Conecte-se a esta sessão "bash" com o comando
Resumindo : você precisa entender a diferença entre o recipiente
run
estart
.Além disso, consulte a documentação para o papel dos parâmetros "
-i t
" e "-d
" para o "Executar"fonte
docker attach ID
. Saia desta sessão sem terminar o bash, você pode usarCTRL-p CTRL-q
Todo esse negócio de saber se você pode ou não iniciar um contêiner parado, depende de como o contêiner foi originalmente criado, ou seja, executado. Se você executou um comando que terminou ou saiu de um comando interativo, por exemplo, bash, 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 contêiner continua em execução, e você pode executar o que quiser e pode parar, iniciar ou reiniciar o contêiner. Obviamente, 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.
fonte
Como você mencionou tarefas periódicas e provavelmente está usando algo como cron devido à maneira que deseja usar
docker exec
, eu tenho apenas o remédio para você. Pelo menos eu acabei fazendo algo assim.Dockerfile
Corra com o habitual
docker run -d ....
(eu useidocker-compose
)Configure as máquinas host crontab, por exemplo:
Acho essa solução agradável quando confiamos no crontab antigo e comprovado em um ambiente linux bastante padrão, enquanto o Docker lida com os deps e variáveis de ambiente mais exóticos da sua lógica de negócios. Você também pode definir alguns limites se suas tarefas periódicas ficarem paralisadas e tiverem vazamentos de memória ou o que for.
fonte
A cauda ainda causa algumas operações de arquivo de tempos em tempos.
Aqui está a minha solução para dormir para sempre, sem efeitos colaterais.
Como funciona
fonte