A maneira certa de manter o contêiner do docker iniciado quando usado para tarefas periódicas

Eu tenho o contêiner docker com software instalado e configurado.

Não há nenhum programa que deva ser iniciado / executado o tempo todo.

O que eu quero - sua capacidade de iniciar algum comando dependendo de eventos externos. comer:

docker exec mysupercont /path/to/mycommand -bla -for

e

docker exec mysupercont /path/to/myothercommand 

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?

Você não precisa executar cada vez 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":

- 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.

  1. Dockerfile

    FROM <some base>CMD tail -f /dev/null
  2. Corra com o habitual docker run -d .... (Eu usei docker-compose)

  3. Configurar máquinas host crontab, por exemplo:

    * * * * * docker exec mysupercont foo >> /var/log/foo.log 2>&1* * * * * docker exec mysupercont bar >> /var/log/bar.log 2>&1

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.

'docker run-d – name=name container tail-f / dev / null`

Esta é uma pergunta muito bem explicada. Veja outro post semelhante here.