首页 > 解决方案 > Python 项目的 Docker 运行失败

问题描述

我的 Python 项目之一具有以下项目结构:

raspi-motion-detection
|-- project
    |-- core
        |-- motion_detector.py
    |-- conf
        |-- conf.json

然后我有以下 Dockerfile:

FROM     jfloff/alpine-python
RUN      mkdir -p /raspi_motion_detection/project
WORKDIR  /raspi_motion_detection/project
COPY     ./ $WORKDIR/
COPY     ./requirements.txt $WORKDIR/
ADD      . $WORKDIR
CMD      ["python", "/core/motion_detector.py --conf conf/conf.json"]

构建映像工作正常,但是当我尝试运行它时,出现以下错误:

Joes-MacBook-Pro-78:project joe$ docker run joesan/dummy
python: can't open file '/raspi_motion_detection/project/core/motion_detector.py --conf /raspi_motion_detection/project/conf/conf.json': [Errno 2] No such file or directory
Joes-MacBook-Pro-78:project joe$

关于发生了什么的任何想法?事实上,我确实将 WORKDIR 添加到了 Docker 运行时,但它仍然找不到必要的 Python 文件。

标签: pythondocker

解决方案


在 Dockerfile 的最后一行:

CMD ["python", "/core/motion_detector.py --conf conf/conf.json"]

当容器启动时,它会尝试启动python并传递一个参数,它会将其解释为要运行的脚本的文件名。该参数被完整地解释为脚本名称,是/core/... conf/conf.json. 由于您没有具有该名称、空格和选项以及所有内容的单个文件,因此 Python 失败了。

如果您使用 JSON 风格的语法,则需要将每个单独的参数分解为自己的“单词”:

CMD ["python", "core/motion_detector.py", "--conf", "conf/conf.json"]

(请注意,该WORKDIR指令全局更改所有后续命令的工作目录,COPYADD指令的默认目录,以及最终运行的任何ENTRYPOINT和/或CMD。没有$WORKDIR可以引用的变量,我怀疑变量扩展实际上导致文件结束在你没想到的时候在容器根目录中。尝试只是COPY ./ ./将内容添加到图像中。)


推荐阅读