Docker cron не работает

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

FROM ubuntu:latestMAINTAINER docker@ekito.frRUN 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 tailRUN touch /var/log/cron.logRUN (crontab -l -u root; echo "* * * * * root rm -rf /opt/*") | crontab# Run the command on container startupCMD cronENTRYPOINT ["/bin/sh", "-c", "/bin/bash"]

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

roadrunner:test shailesh$ docker run -it crontest /bin/bashroot@ac31f5acc49f:/# lsbin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@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:latestMAINTAINER docker@ekito.frRUN apt-get update && apt-get -y install cron# Add crontab file in the cron directoryADD crontab /etc/cron.d/hello-cron# Give execution rights on the cron jobRUN chmod 0644 /etc/cron.d/hello-cron# Apply cron jobRUN crontab /etc/cron.d/hello-cron# Create the log file to be able to run tailRUN touch /var/log/cron.log# Run the command on container startupCMD 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, чтобы она выглядела следующим образом:

    ВЫПОЛНИТЬ (crontab -l -u root; echo "* * * * * rm -rf /opt/*") | crontab
  • Вы можете поместить запись crontab в файл в разделе /etc/cron.d вместо этого, вот так:

    >ВЫПОЛНИТЬ (эхо "* * * * * 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

Learn about when to use ENTRYPOINT vs CMD.