[英]Python dependencies and Docker and Crontab
嘗試在 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
,一切都按預期工作。
這里可能是什么問題? 我在想需求文件沒有安裝到正確的位置?
在 docker 中使用 python 我絕對發現使用 vendoring 工具很有幫助。 運行腳本或一系列RUN
命令,而不是復制本地站點包:
pip install -r requirements.txt
這是我在開發中使用的腳本中的一個示例:
pip3 install virtualenv;
virtualenv --no-site-packages --python=python3.6 app;
virtualenv --relocatable app;
source ./app/bin/activate;
pip3 install -r requirements.txt;
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
開始調試您的導入問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.