Docker中Cron调度Python脚本遇requests模块找不到错误
Docker容器中Cron运行Python脚本提示ModuleNotFoundError的解决方案
问题原因
- Cron运行时的环境变量与容器主进程不共享,Dockerfile中通过
ENV设置的PYTHONPATH不会被Cron继承。 - Cron默认调用的
python3可能是系统(apt安装)版本,而非Python镜像自带的已安装依赖的解释器,导致找不到requests模块。
解决方案
方案1:直接在Cron任务中指定Python绝对路径并设置环境变量
修改cronjob.txt,在任务前添加环境变量配置,并指定Python的绝对路径:
# 设置PYTHONPATH指向依赖安装目录 PYTHONPATH=/usr/local/lib/python3.11/site-packages # 用绝对路径调用Python脚本,避免工作目录问题 */2 * * * * /usr/local/bin/python3 /root/runSync.py > /proc/1/fd/1 2>/proc/1/fd/2
方案2:用Shell脚本封装执行逻辑(更易维护)
- 创建
run_sync.sh脚本:
#!/bin/bash # 显式设置环境变量 export PYTHONPATH=/usr/local/lib/python3.11/site-packages # 调用Python脚本 /usr/local/bin/python3 /root/runSync.py
- 修改Dockerfile,添加脚本复制和权限设置:
FROM python:latest WORKDIR /root COPY *.py . COPY requirements.txt . COPY cronjob.txt . COPY run_sync.sh . # 新增复制脚本 RUN pip install -r requirements.txt RUN apt update && apt install cron -y RUN chmod +x run_sync.sh # 新增赋予执行权限 RUN crontab -l | { cat; cat cronjob.txt; } | crontab - CMD cron -f
- 修改
cronjob.txt为执行Shell脚本:
*/2 * * * * /root/run_sync.sh > /proc/1/fd/1 2>/proc/1/fd/2
方案3:使用系统级Cron配置文件(更规范)
将Cron任务和环境变量写入/etc/cron.d目录的配置文件,替代用户级crontab:
修改Dockerfile中的Cron配置步骤:
# 替换原有的crontab命令 RUN echo "PYTHONPATH=$PYTHONPATH" > /etc/cron.d/sync-job \ && cat cronjob.txt >> /etc/cron.d/sync-job \ && chmod 0644 /etc/cron.d/sync-job
此时cronjob.txt只需保留任务行:
*/2 * * * * root /usr/local/bin/python3 /root/runSync.py > /proc/1/fd/1 2>/proc/1/fd/2
(注意要添加root用户,因为系统级Cron需要指定执行用户)
验证方法
构建新镜像并启动容器后,可通过以下命令验证Cron任务:
# 进入容器 docker exec -it <容器ID> bash # 查看Cron日志(部分系统需要安装rsyslog) apt install rsyslog -y && service rsyslog start && tail -f /var/log/syslog
或者直接观察容器日志,确认脚本正常输出。
内容的提问来源于stack exchange,提问作者Darohan
相关产品推荐
相关产品推荐

