Я пытаюсь создать образ 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