I am trying to build a docker image which would have a cron. A cron which will delete files from particular location of docker file system. Below is my 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"]
Everything is successful. my cron is also set in the container
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
However it is not running and deleting the files which are in /opt/ folder. Can someone tell me what is wrong in the configuration.
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
There are two places where you can place cron files:
in the user's own crontab file, usually under /var/spool/cron/USERNAME. This is where things get placed automatically if you use the command crontab.
in /etc/cron.d
If you place it in /etc/cron.d, the file must contain the name of the user you're running it under, since there's otherwise no connection between the file and the user. But if you use the crontab command, the cron specification will be placed in the crontab belonging to your user (or to the user you specify when invoking crontab), so you don't need to include the username.
So to fix this you can do either one of two things:
You can remove the username from the string you're passing to the crontab command, so that it looks like this:
I've got the same issue in the same context. My tip is to create a bash script to do whatever you want at the container's startup.
and then set the CMD in the Dockerfile to run it using JSON array syntax.
I have a file start.sh to do some stuff and I use & to run it in the background and then I run cron && apache2-foregroung to start the cron and the apache server.
This is the final command at the end of my Dockerfile: