Я пытаюсь создать образ докера, в котором будет 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:
/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