我的一个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文件。
答案 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
指令会全局更改所有后续命令的工作目录,COPY
和ADD
指令的默认目录以及任何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在某些方面似乎也是错误的
希望有帮助