O jeito certo de manter o contêiner docker iniciado quando usado para tarefas periódicas

36

Eu tenho um 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. como:

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 esse contêiner tem alguns dados "ativos" dentro dele, que são usados para esses comandos, então não posso usar

docker run ...

de cada vez, porque recria o contêiner da imagem e destrói meus dados.

Qual é o "direito" e a "melhor" maneira de manter esse contêiner funcionando? Qual comando eu posso começar por dentro?

    
por Korjavin Ivan 23.01.2015 / 17:24

3 respostas

42

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 Keep STDIN open even if not attached
-t, --tty=false Allocate a pseudo-TTY

Exemplo:

docker run -it debian:stable bash

Depois que o trabalho foi concluído, o comando especificou na inicialização (no meu exemplo bash). Por exemplo, você executa a "saída". O contêiner para:

CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS                     PORTS               NAMES
1329c99a831b        debian:stable              "bash"                 51 seconds ago      Exited (0) 1 seconds ago                       goofy_bardeen

Agora você pode começar de novo

docker start 1329c99a831b

O contêiner é iniciado e executa novamente o comando "bash".
Conecte-se a esta sessão "bash" com o comando

docker attach 1329c99a831b

Para resumir : você precisa entender a diferença entre o contêiner run e start .
Além disso, consulte a documentação para ver a função dos parâmetros " -i t " e " -d " para o " Executar "

    
por 27.01.2015 / 06:04
4

Todo esse negócio de iniciar ou não um contêiner parado depende de como o contêiner foi originalmente criado, por exemplo, executar. 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 estivador 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 será interrompido quando você sair, mas você poderá iniciá-lo novamente.

    
por 07.02.2018 / 18:21
1

Já que você mencionou tarefas periódicas e provavelmente está usando algo como o 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. Execute com o usual docker run -d .... (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 interessante, já que confiamos no crontab antigo e comprovado em um ambiente linux padrão bonito, enquanto o Docker lida com as mais exóticas e variáveis de ambiente de sua lógica de negócios. Você também pode definir alguns limites se suas tarefas periódicas ficarem presas & tem vazamentos de memória ou qualquer outra coisa.

    
por 03.05.2018 / 21:55