我有 python 脚本,我想使用 crontab 上添加的 shell 脚本在 docker 容器内执行。 我创建了以下 dockerfile:
FROM python:3.10.12
# create directory for logs
RUN mkdir /logs
# create a folder and copy code to it
WORKDIR /app
COPY . /app
# make python and shell script executable
RUN find . -name "*.py" -exec chmod +x {} \;
RUN find . -name "*.sh" -exec chmod +x {} \;
# install dependencies
RUN apt-get -y update && apt-get install -y default-libmysqlclient-dev
RUN pip install -r requirements.txt
RUN apt-get update && apt-get install -y cron && apt-get install -y vim
# Copy the cron file to the container
COPY cronfile.cronjob /etc/cron.d/cronfile.cronjob
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/cronfile.cronjob
# Apply the cron job
RUN crontab /etc/cron.d/cronfile.cronjob
# create log file
RUN touch /var/log/cron.log
# start the cron daemon
CMD ["cron", "-f"]
这是 cronfile.cronjob 内容:
* * * * * echo "Hello world" `date` >> /var/log/cron.log 2>&1
40 19 * * * /app/crons/test.sh >> /var/log/cron.log 2>&1
在 app/crons 目录中我有 test.sh shell 脚本。
当我使用命令检查 cron 服务时:
service cron status
它显示运行状态。
关于使用命令:crontab -l
它显示 crontab 中的 cronfile.cronjob 内容
但 cronjobs 仍然没有执行。
无法理解这里的问题。
我希望 cron 执行 cronfile.cronjob 中提到的 cronjobs。 我已经尝试了很多方法但无法理解这个问题 我尝试了以下链接帮助资源,但没有任何效果。 解决方案1 解决方案2 解决方案3
我已将您的 docker 文件精简为我可用的内容,以便我可以重现您的问题,这就是:
FROM python:3.10.12
RUN apt-get update && apt-get install -y cron && apt-get install -y vim
# Copy the cron file to the container
COPY cronfile.cronjob /etc/cron.d/cronfile.cronjob
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/cronfile.cronjob
# Apply the cron job
RUN crontab /etc/cron.d/cronfile.cronjob
# create log file
RUN touch /var/log/cron.log
# start the cron daemon
CMD ["cron", "-f"]
我看到确实执行了cron作业,在/var/log/cron.log中检查了它,但是docker log中没有任何输出。
正如链接解决方案之一中提到的,您必须在 cronjob 文件中更改一点重定向:
* * * * * echo "Hello world" `date` > /proc/1/fd/1 2>/proc/1/fd/2
它通过 cron 打开的句柄将输出重定向到进程 stdout 和 stderr。其中 1 代表主 docker 进程的 pid (cron)