Mas "exec" impossível quando o contêiner é interrompido, e também este 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 posso iniciar dentro?
docker run na verdade, é uma sequência de dois comandos: "criar " e"iniciar".
Ao executar o contêiner, você deve especificar o "-it":
- i, --interactive = false mantenha stdin aberto mesmo se não estiver conectado - t, --tty=false aloque um pseudo-TTY
Exemplo:
docker run -it debian:stable bash
Depois que o trabalho foi concluído comando especificado na inicialização (no meu exemplo bash). Por exemplo, você executa a "saída". Contentor pára:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1329c99a831b debian:stable "bash" 51 seconds ago Exited (0) 1 seconds ago goofy_bardeen
Agora você pode iniciá-lo novamente
docker start 1329c99a831b
O contêiner é iniciado e novamente executa o comando "bash". Conecte-se a esta sessão "bash" com o comando
docker attach 1329c99a831b
Resumir: você tem que entender a diferença entre o run e start recipiente. Além disso, olhe para o documentacao para o papel dos parâmetros "-i t" e "-d"para a "corrida"
Já que você mencionou tarefas periódicas e provavelmente está usando algo como cron por causa da maneira como deseja usar docker exec, Eu tenho apenas o remédio para você. Pelo menos acabei fazendo algo assim.
Dockerfile
FROM <some base>CMD tail -f /dev/null
Corra com o habitual docker run -d .... (Eu usei docker-compose)
Acho essa solução agradável, pois podemos confiar no antigo e comprovado crontab em um ambiente linux bastante padrão, enquanto o Docker lida com os deps e variáveis de ambiente mais exóticos da lógica de negócios. Você também pode definir alguns limites se suas tarefas periódicas ficar preso & Tem vazamentos de memória ou qualquer outra coisa.
O Tail ainda causa algumas operações de arquivo de tempos em tempos.
Durma para sempre, sem efeitos colaterais
# Ah, ha, ha, ha, stayin' alive...while :; do :; done & kill -STOP $! && wait $!
Como funciona
while :; # Run an endless loop,do :; # of do nothing,done & # as background task.kill -STOP $! # Stop the background task.wait $! # Wait forever, because background task process has been stopped.
Todo esse negócio de saber se você pode ou não iniciar um contêiner interrompido depende de como o contêiner foi criado originalmente, ou seja, executado. Se você executou um comando que terminou ou saiu de um comando interativo, por exemplo, bash, não é possível iniciar, reiniciar ou executar o contêiner interrompido. 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. Claro, esta é apenas uma descoberta preliminar baseada na imagem Alpina. Observe que, se você anexar ao contêiner, ele irá parar quando você sair, mas você pode iniciá-lo novamente.