Python依赖关系以及Docker和Crontab

时间:2018-11-09 23:53:57

标签: python docker redis cron

尝试通过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时,一切都按预期运行。

这里可能是什么问题?我在想需求文件没有安装到正确的位置?

2 个答案:

答案 0 :(得分:1)

在docker中使用python时,我肯定发现使用供应商工具会有所帮助。代替复制本地站点程序包,而运行脚本或一系列RUN命令,这些脚本或命令将:

  1. 建立虚拟环境
  2. 激活它
  3. 致电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.指出的那样,了解您的需求安装在哪里会很有帮助...但是,如果我的怀疑正确,则有两个简单的解决方案:

  1. 将您的cron作业命令更改为cd /src && python ...
  2. 明确设置您的PYTHONPATH,使其包含要安装的位置

要进一步调试,请执行docker exec -it your-container-name bash,然后执行cd ~切换到您的主目录,因为这是cron作业的运行源。到达该位置后,尝试运行脚本,如果该脚本不起作用,请尝试echo $PYTHONPATH开始调试导入问题。