Cronjob 未在 docker 容器内运行

问题描述 投票:0回答:1

我有 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

python docker cron dockerfile
1个回答
0
投票

我已将您的 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 打开的句柄将输出重定向到进程 stdoutstderr。其中 1 代表主 docker 进程的 pid (cron)

© www.soinside.com 2019 - 2024. All rights reserved.