Search code examples
dockercron

Cronjob in docker container not running


I am a beginner with cronjobs. I've spent some time reading various posts on StackOverflow and that is how I came up with the solution below. It still isn't working how I want it to, maybe someone can help?

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 is:

  1. Run my run.sh (I've managed to get that working)
  2. Setup a cronjob inside my container which is defined in a file called cronjob (see content below)

The 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


Solution

  • As Saeed said in this comment

    First of all, your cronjob command is wrong. You should have 2>&1 instead of 2&>1. Second. run ls -lh /app/cron.sh to see if your file is copied. Also be sure cron.sh is in the directory where your Dockerfile is.

    2&>1 was the mistake that I had made.