Configurar um cron em paralelo a um trabalho único
Crie um arquivo de script, digamos run.sh, com o trabalho que deve ser executado periodicamente.
#!/bin/bash
timestamp=`date +%Y/%m/%d-%H:%M:%S`
echo "System path is $PATH at $timestamp"
Salvar e sair.
Usar ponto de entrada em vez de CMD
Se você tiver vários trabalhos para iniciar durante a contêiner do docker, use o arquivo do ponto de entrada para executá-los todos.
O arquivo do ponto de entrada é um arquivo de script que entra em ação quando um comando de execução do docker é emitido. Portanto, todas as etapas que queremos executar podem ser colocadas nesse arquivo de script.
Por exemplo, temos 2 trabalhos a serem executados:
Executar uma tarefa : echo “O contêiner do Docker foi iniciado”
Executar trabalho periódico : run.sh
Criar entrypoint.sh
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
# Setup a cron schedule
echo "* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Vamos entender o crontab que foi configurado no arquivo
* * * * *
: Cron horário; o trabalho deve ser executado a cada minuto. Você pode atualizar a programação com base em seus requisitos.
/run.sh
: O caminho para o arquivo de script que deve ser executado periodicamente
/var/log/cron.log
: O nome do arquivo para salvar a saída do trabalho cron agendado.
2>&1
: Os logs de erro (se houver) também serão redirecionados para o mesmo arquivo de saída usado acima.
Nota : Não esqueça de adicionar uma nova linha extra, pois ela é um cron válido.
Scheduler.txt
: a configuração completa do cron será redirecionada para um arquivo.
Usando variáveis de ambiente específicas do sistema / usuário no cron
Meu trabalho cron real estava esperando a maioria dos argumentos, conforme as variáveis de ambiente passavam para o comando docker run. Mas, com o bash, não pude usar nenhuma das variáveis de ambiente que pertencem ao sistema ou ao contêiner do docker.
Em seguida, isso surgiu como uma solução alternativa para esse problema:
- Adicione a seguinte linha no entrypoint.sh
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
- Atualize a configuração do cron e especifique
SHELL=/bin/bash
BASH_ENV=/container.env
Por fim, você entrypoint.sh
deve parecer
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
declare -p | grep -Ev 'BASHOPTS|BASH_VERSINFO|EUID|PPID|SHELLOPTS|UID' > /container.env
# Setup a cron schedule
echo "SHELL=/bin/bash
BASH_ENV=/container.env
* * * * * /run.sh >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
Por último, mas não menos importante: criar um arquivo Docker
FROM ubuntu:16.04
MAINTAINER Himanshu Gupta
# Install cron
RUN apt-get update && apt-get install -y cron
# Add files
ADD run.sh /run.sh
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /run.sh /entrypoint.sh
ENTRYPOINT /entrypoint.sh
É isso aí. Crie e execute a imagem do Docker!
RUN apt-get update && apt-get install cron