Okay so firstly I read some posts on this topic. That is how I ended up with my solution. Still I don’t find my mistake. Also I am more of a beginner.
So this is my docker file:
FROM conda/miniconda3
WORKDIR /app
RUN apt-get update -y
RUN apt-get install cron -y
RUN apt-get install curl -y
RUN conda update -n base -c defaults conda
RUN conda install mamba -n base -c conda-forge
COPY ./environment.yml ./environment.yml
RUN mamba env create -f environment.yml
# Make RUN commands use the new environment:
SHELL ["conda", "run", "--no-capture-output", "-n", "d2", "/bin/bash", "-c"]
#Setup cron
COPY ./cronjob /etc/cron.d/cronjob
RUN crontab /etc/cron.d/cronjob
RUN chmod 0600 /etc/cron.d/cronjob
RUN touch ./cron.log
COPY ./ ./
RUN ["chmod", "+x", "run.sh"]
ENTRYPOINT ["sh", "run.sh"]
CMD ["cron", "-f"]
What I want to do:
- Run my
run.sh
(I managed to do that.) - Setup a cronjob inside my container which is defined in a file called
cronjob
(see content below)
My cronjob is not working. Why?
Note that cron.log is empty. It is never triggered.
Also the output of crontab -l
(run inside of the container) is:
$ crontab -l
# Updates every 15 minutes.
*/15 * * * * /bin/sh /app/cron.sh >> /app/cron.log 2&>1
cronjob
# Updates every 15 minutes.
*/15 * * * * /bin/sh /app/cron.sh >> /app/cron.log 2&>1
4
Answers
As Saeed said in this comment
2&>1
was the mistake that I had made.As Saeed pointed out already, there is reason to believe you did not place your cron.sh script inside the container.
On top of that cron is programmed such that it does not log failed invocations anywhere. You can try to turn on some debug logging (I almost had to search cron’s source to find the right settings years ago). Finally cron will send it’s debug output to syslog – but in your container only cron is running, so the log entries are probably lost on that stage again.
That ultimately means you are in the dark and need to find the needle. But installing the script is a first good attempt.
I had a similar issue with the crontab not being read
I was also using something like:
Locally the
cronjob
file had permissions of 664 instead of 644. This was causing cron to logSep 29 16:21:01 0f2c2e0ddbfd cron[389]: (*system*crontab) INSECURE MODE (group/other writable) (/etc/cron.d/crontab)
(I actually had to install syslog-ng to see this happen).Turns out cron will refuse to read cron configurations if they are writeable by others. I guess it makes sense in hindsight but I was completely oblivious to this.
Changing my cronjob file permissions to 644 fixed this for me (I did this on my local filesystem, the Dockerfile copies permissions over)
only you need to root right then it will solve issuse
*/15 * * * * root /bin/sh /app/cron.sh >> /app/cron.log 2&>1