【问题标题】:Python dependencies and Docker and CrontabPython 依赖项和 Docker 和 Crontab
【发布时间】:2019-04-13 13:19:42
【问题描述】:

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

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

【问题讨论】:

  • 你在哪里安装你的需求?

标签: python docker redis cron


【解决方案1】:

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 开始调试您的导入问题。

【讨论】:

    【解决方案2】:

    在 docker 中使用 python,我肯定发现使用 vendoring 工具很有帮助。不要复制本地站点包,而是运行一个脚本或一系列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;
    

    【讨论】:

    • 由于 docker 容器已经是一个孤立的环境,因此在那里使用虚拟环境并没有任何额外的优势。此外,您的回答似乎无法解决实际问题,只是一般性建议。
    • 由于错误是找不到模块,我实际上希望这种方法可以解决问题。它确保 deps 就位,并确保它们可供解释器使用。 @克劳斯D。
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2018-05-12
    相关资源
    最近更新 更多