[英]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.