Назад | Перейти на главную страницу

докер cron не работает

Я пытаюсь создать образ докера, в котором будет cron. Cron, который удалит файлы из определенного места файловой системы Docker. Ниже мой Dockerfile

FROM ubuntu:latest
MAINTAINER docker@ekito.fr

RUN apt-get update && apt-get -y install cron

# Copy testfiles folder to docker container.
COPY ./testfiles /opt/

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

RUN (crontab -l -u root; echo "* * * * * root rm -rf /opt/*") | crontab

# Run the command on container startup
CMD cron

ENTRYPOINT ["/bin/sh", "-c", "/bin/bash"]

Все удачно. мой cron также установлен в контейнере

roadrunner:test shailesh$ docker run -it crontest /bin/bash
root@ac31f5acc49f:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@ac31f5acc49f:/# crontab -l
* * * * * root rm -rf /opt/*
root@ac31f5acc49f:/# cd /opt/
root@ac31f5acc49f:/opt# ls  
file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19  file2  file20  file21  file22  file23  file24  file25  file3  file4  file5  file6  file7  file8  file9

Однако он не работает и удаляет файлы, которые находятся в /opt/ папка. Может кто подскажет, что не так в конфигурации.

Попробуйте что-нибудь вроде этого,

FROM ubuntu:latest
MAINTAINER docker@ekito.fr

RUN apt-get update && apt-get -y install cron

# Add crontab file in the cron directory
ADD crontab /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Apply cron job
RUN crontab /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD cron && tail -f /var/log/cron.log

создайте файл crontab и добавьте такую ​​запись

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

Надеюсь, что это поможет вам!!!

Ваш синтаксис crontab неверен.

Есть два места, где вы можете разместить файлы cron:

  • в собственном файле crontab пользователя, обычно в /var/spool/cron/USERNAME. Здесь все автоматически размещается, если вы используете команду crontab.
  • в /etc/cron.d

Если вы поместите его в /etc/cron.d, файл должен содержать имя пользователя, под которым вы его запускаете, поскольку в противном случае нет связи между файлом и пользователем. Но если вы используете crontab , спецификация cron будет помещена в crontab, принадлежащий вашему пользователю (или пользователю, указанному вами при вызове crontab), поэтому вам не нужно указывать имя пользователя.

Чтобы исправить это, вы можете сделать одно из двух:

  • Вы можете удалить имя пользователя из строки, передаваемой команде crontab, чтобы она выглядела так:

    RUN (crontab -l -u root; echo "* * * * * rm -rf /opt/*") | crontab
  • Вы можете поместить запись crontab в файл под /etc/cron.d вместо этого вот так:

    RUN (echo "* * * * * root rm -rf /opt/*" > /etc/cron.d/clearopt)

У меня такая же проблема в том же контексте. Мой совет - создать сценарий bash, который будет делать все, что вы хотите, при запуске контейнера.
а затем установите CMD в Dockerfile для его запуска с использованием синтаксиса массива JSON.

У меня есть файл start.sh для некоторых вещей, и я использую & чтобы запустить его в фоновом режиме, а затем я запускаю cron && apache2-foregroung, чтобы запустить cron и сервер apache.

Это последняя команда в конце моего Dockerfile:

CMD ./start.sh > web/startup.log & cron && apache2-foreground