docker cron not working
Solution 1
Try some thing like this,
FROM ubuntu:latest
MAINTAINER [email protected]
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
create file crontab and add an entry like this
* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1
Hope this will help you!!!
Solution 2
Your crontab syntax is wrong.
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 commandcrontab
. - 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:
RUN (crontab -l -u root; echo "* * * * * rm -rf /opt/*") | crontab
You can place the crontab entry in a file under
/etc/cron.d
instead, like this:RUN (echo "* * * * * root rm -rf /opt/*" > /etc/cron.d/clearopt)
Related videos on Youtube
Shailesh Sutar
All posts are imaginary and fictional. A resemblance to any current or past affair is pure coincidence. IT Engineer by profession. Curious about human behavior.
Updated on September 18, 2022Comments
-
Shailesh Sutar over 1 year
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 [email protected] 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.-
Michael Hampton almost 6 yearsLearn about when to use ENTRYPOINT vs CMD.
-
-
Shailesh Sutar almost 6 yearsThank you for the answer but this isn't helping. It's not making a log entry in that location
/var/log/cron.log 2>&1
-
RalfFriedl almost 5 yearsBut that runs at startup,not regularly.
-
Micael Mota over 4 years@RalfFriedl I've got this running now and just edited my answer, look at this now and let me know if you still have some doubt
-
Micael Mota over 4 yearsyou need to start the cron process everytime you start the container, but we can have only one CMD command in Dockerfiles.
-
Damien C almost 4 yearsWorks great, but environment variables have not the same values than in interactive bash command line with same user
-
Nicolae almost 3 years
failed running [/bin/sh -c "crontab /etc/cron.d/hello-cron"]: exit code: 127
-
doraemon over 2 yearsI found that your approach works. After executing
crontab
,/var/spool/cron/crontabs/root
is generated, which contains job definitions (noroot
in job definition). However, I cannot get the second one work if I later runcron -f
to start. I feel that in my ubuntu docker image,cron -f
does not manage the files in/etc/cron.d
. Did miss something to letcron
read the files in/etc/cron.d
? -
doraemon over 2 yearsEDIT for the previous comment: I should have typed "your first approach works".
-
doraemon over 2 yearsI think this answer used a wrong syntax for the job definition. When we use
crontab filename
to install cron jobs, the user field (root
here) should not be put after* * * * *
. See Jenny's answer below. The user field is needed only for/etc/crontab
or files inside/etc/cron.d/
. However, I don't know how to install jobs defined in these files. In ubuntu,man cron
sayscron
also look for jobs in these files. However, in docker, they do not work. Don't know why