簡體   English   中英

Python 模塊未在 docker 容器中運行

[英]Python module not running in docker container

Dockerfile:

FROM python:3.10-slim
WORKDIR /watch
ADD requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
ADD webwatcher /app/webwatcher

VOLUME /watch
ENV IS_DOCKER=true
ENV PYTHONPATH "/app"
ENTRYPOINT python3 -m webwatcher

我在模塊中的__main__.py

import signal
from time import sleep
from .watchdog import register_observer

observer = register_observer()

def finish(signum, frame):
    print('\nExiting application...')
    observer.stop()
    observer.join()
    exit(0)

print('Registering signals')
signal.signal(signal.SIGTERM, finish)
signal.signal(signal.SIGINT, finish)

print('Running module')
observer.start()
while True:
    sleep(1)

然后我構建容器

docker build -t webwatcher:latest .

並運行

docker run --rm --name web -v path:/watch/path webwatcher:latest

但是當我運行時,它根本沒有顯示 output。 它也不允許我從運行命令中使用 Ctrl+C 退出, docker stop工作(超時然后終止它)。

為什么模塊不能從容器中正常運行?

我認為這里有兩個不同的問題。 默認情況下,docker 在沒有 TTY 分配的情況下運行容器,並且在這些情況下某些程序運行略有不同。 在這種情況下,Python 將緩沖標准輸出 stream。 為防止這種情況,您可以改為運行docker run -it

另一個問題是 Dockerfile 具有“外殼形式” ENTRYPOINT python3 -m webwatcher而不是 JSON 符號ENTRYPOINT ["python3", "-m", "webwatcher"]

來自 hadolint 文檔:

shell 形式阻止使用任何 CMD 或運行命令行 arguments,但缺點是您的 ENTRYPOINT 將作為 /bin/sh -c 的子命令啟動,不傳遞信號。 這意味着可執行文件不會是容器的 PID 1 - 並且不會收到 Unix 信號 - 因此您的可執行文件不會收到來自 docker 停止的 SIGTERM。

如果您喜歡使用 linters,您可能會發現hadolint可用於捕獲此類錯誤。

暫無
暫無

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

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