尝试通过Docker容器中的Crontab运行Python脚本时遇到一个奇怪的问题。这是设置。
我有一个像这样的Dockerfile:
FROM python:3-onbuild
# Install cron and dependencies
RUN apt-get update && apt-get -y install cron
# Add crontab file in the cron directory
ADD crontab /etc/cron.d/simple-cron
WORKDIR /src
COPY . /src
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/simple-cron
RUN chmod 777 /usr/local/lib/python3.6/site-packages
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Run the command on container startup
CMD ["cron", "-f"]
还有一个像这样的crontab文件:
* * * * * root python /src/test.py > /proc/1/fd/1 2>/proc/1/fd/2
这在我启动容器时正确执行,没有任何问题。我的Python文件的第一行是import redis
,这会导致脚本失败,表示找不到该模块。
有趣的是,当我手动执行docker exec -it [container_name] python test.py
时,一切都按预期运行。
这里可能是什么问题?我在想需求文件没有安装到正确的位置?
答案 0 :(得分:1)
在docker中使用python时,我肯定发现使用供应商工具会有所帮助。代替复制本地站点程序包,而运行脚本或一系列RUN
命令,这些脚本或命令将:
pip install -r requirements.txt
这是我在dev中使用的脚本的一个示例:
pip3 install virtualenv;
virtualenv --no-site-packages --python=python3.6 app;
virtualenv --relocatable app;
source ./app/bin/activate;
pip3 install -r requirements.txt;
答案 1 :(得分:0)
cron
在您的主目录中运行命令,而不是在Dockerfile中的WORKDIR
中运行命令。 docker exec -it...
将运行WORKDIR
中的指定命令,在您的情况下为/src
。我的猜测是您将需求安装到PYTHONPATH
目录中未包含但可以在/src
目录中看到的位置吗?正如@Klaus D.指出的那样,了解您的需求安装在哪里会很有帮助...但是,如果我的怀疑正确,则有两个简单的解决方案:
cd /src && python ...
PYTHONPATH
,使其包含要安装的位置要进一步调试,请执行docker exec -it your-container-name bash
,然后执行cd ~
切换到您的主目录,因为这是cron作业的运行源。到达该位置后,尝试运行脚本,如果该脚本不起作用,请尝试echo $PYTHONPATH
开始调试导入问题。