Crontab no contêiner docker

0

Oi eu estou tentando executar um cron job em um contêiner docker. Então eu adicionei isso no meu Dockerfile

Meu Dockerfile

FROM nginx:stable

RUN apt-get update -y && apt-get upgrade -y && apt-get install -y \
    vim \
    git \
    curl \
    wget \
    certbot \
    cron

COPY cron/crontab /etc/crontab
RUN chmod 0644 /etc/cron.d/crontab
RUN /etc/init.d/cron start 

Meu arquivo crontab

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the 'crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
*/1 *   *   *   * root echo "test" >>~/readme

Mas isso não funciona.

Eu tenho que executar o comando /etc/init.d/cron start manualmente no meu container nginx se eu quiser que ele funcione.

Então eu adicionei um entrypoint no meu Dockerfile , então este comando pode ser executado quando o container começar.

# ENTRYPOINT
ADD entrypoint.sh /entrypoint.sh
RUN chmod 777 /entrypoint.sh

Meu entrypoint.sh

#!/usr/bin/env bash

/etc/init.d/cron start

Meu docker-compose

entrypoint: /entrypoint.sh

Mas eu tenho esse erro:

OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "process_linux.go:86: executing setns process caused \"exit status 21\"": unknown

Eu senti falta de algo?

PS: Eu segui este tutorial

    
por Kevin 08.03.2018 / 18:20

1 resposta

0

O que você está usando como base para sua imagem do Docker (por exemplo, o que está na linha FROM )?

Muitas imagens da base de encaixe começam com uma instalação mínima de uma distribuição existente (por exemplo, alpine, debian, ubuntu, centos, etc) e, em seguida, você adiciona todos os pacotes necessários a ela.

Se sua imagem de base não incluir cron por padrão, instale-a no Dockerfile usando a ferramenta de pacote apropriada da distribuição (por exemplo, apt-get install cron ) e configure-a como faria em qualquer outro sistema - por exemplo adicionando uma entrada a um arquivo crontab do sistema como /etc/crontab ou descartando um script executável em /etc/cron.d .

Em alguns casos, cron pode estar instalado, mas desativado. Você precisa modificar o script de inicialização do seu contêiner para que ele inicie crond . Isso não é o mesmo que usar o comando RUN no Dockerfile (que é para executar comandos durante o processo de criação do contêiner, não na inicialização de cada contêiner). Os detalhes de como fazer isso variam de acordo com a imagem base usada.

    
por 09.03.2018 / 03:46

Tags