Docker Run因Python项目失败

时间:2018-11-11 12:14:56

标签: 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文件。

2 个答案:

答案 0 :(得分:3)

在Dockerfile的最后一行中:

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

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

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

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

(请注意,WORKDIR指令会全局更改所有后续命令的工作目录,COPYADD指令的默认目录以及任何ENTRYPOINT和/或CMD最终会运行。没有$WORKDIR变量可供您参考,我怀疑变量扩展实际上会导致文件意外出现在容器根目录中,请尝试{{1 }},将内容添加到图像。)

答案 1 :(得分:0)

好吧,您要使用完全相对路径,就像它们是相对路径一样。

假设您的Dockerfile位于项目结构的raspi-motion-detection文件夹中...

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

/core...部分(请注意,我将所有命令部分分解为单独的项目)实际上将指向相对于根文件夹的位置,因为它以'/'开头,并且应该从此处实际看: / p>

/raspi_motion_detection/project/project/core/motion_detector.py

conf/conf.json也是如此,实际上是指向相对于WORKDIR的某个东西。您可能也想在这里更具体:-)

您可以通过运行以下命令来检查您的配置:

docker run -it --rm your_image /bin/bash

,然后查看您在构建中实际添加的方式和内容。

您的Dockerfile在某些方面似乎也是错误的

  • 您不能使用$ WORKDIR引用WORKDIR
  • 您复制了requirements.txt文件,但是从不运行它,因此它可能永远不会做任何事情
  • 您会看到要复制整个结构,并且dat将包含不必要的Dockerfile

希望有帮助