簡體   English   中英

Python 依賴項以及 Docker 和 Crontab

[英]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命令,而不是復制本地站點包:

  1. 建立虛擬環境
  2. 激活它
  3. 調用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. 指出的那樣,了解您的要求安裝在哪里會很有幫助……但如果我的懷疑是正確的,那么有兩個簡單的解決方案:

  1. 將您的 cron 作業命令更改為cd /src && python ...
  2. 顯式設置您的PYTHONPATH以包含安裝您的要求的任何位置

要進一步調試,請執行docker exec -it your-container-name bash ,然后執行cd ~更改到您的主目錄,因為這是運行 cron 作業的位置。 在那里,嘗試運行您的腳本,如果這不起作用,請嘗試echo $PYTHONPATH開始調試您的導入問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM