python - 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 文件。
解决方案
在 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
指令全局更改所有后续命令的工作目录,COPY
和ADD
指令的默认目录,以及最终运行的任何ENTRYPOINT
和/或CMD
。没有$WORKDIR
可以引用的变量,我怀疑变量扩展实际上导致文件结束在你没想到的时候在容器根目录中。尝试只是COPY ./ ./
将内容添加到图像中。)
推荐阅读
- c++ - GRPC/C++ - 服务器只从双向流中读取第一条消息
- python - Get value from a line intersecting 0.0 level
- node.js - 错误离子服务确实弹出未处理的异常:NGCC失败
- c# - 如何从格式不同的字符串中提取数字?
- c# - 检查网格中瓷砖的相邻性
- c# - Web 服务器上的 HRESULT 0x80070057 - asp.net
- mysql - 为什么我在使用 AES_DECRYPT 时收到没有更多详细信息的错误?
- python - 使用 nltk 从字典中删除非英语单词
- c# - WPF 绑定问题 - 显示不可见的项目
- c - 为什么即使保证返回,我也会收到警告“控制到达非无效函数的结尾”