Dockerfile无法找到app.py.

时间:2017-01-08 04:33:50

标签: python docker

我在一个烧瓶应用程序中有以下文件夹结构,我将其嵌入到docker镜像中。

├── Dockerfile
├── README.md
├── app
│   ├── __init__.py
│   ├── app.py
│   ├── db
│   ├── imgcomp
│   │   └── __init__.py
│   ├── static
│   └── templates
│       ├── comparison_result.html
│       ├── display_images.html
│       ├── index.html
│       └── upload.html
├── docker-compose.yml
├── requirements.txt
└── tests

这些是docker-compose.yml:

的内容
version: '2'
services:
    web:
    build: .
    ports:
       - "5000:5000"
    volumes:
       - .:/code

这些是Dockerfile的内容:

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

当我运行docker-compose时,我收到错误:

web_1  | python: can't open file 'app.py': [Errno 2] No such file or directory

仅仅因为它在子文件夹中。将参数更改为app / app.py并没有帮助。此外,当我运行docker-compose down,然后编辑文件时,当我再次运行docker-compose时,它似乎没有注册对文件的任何更改。我错过了什么?

2 个答案:

答案 0 :(得分:2)

issue 1616

中存在同样的问题
  

问题似乎主要是Dockerfile中ADD / WORKDIR的结果:

ADD . /code
WORKDIR /code
  

与docker-compose.yml

中的卷映射冲突
volumes:
 - .:/code
  

我可能误读了说明书,但两者都有。

原因:

  

在远程主机上运行应用程序时,您需要从本地目录中删除任何装入任何内容的volumes条目。

     

我们促进将代码添加到映像并将其作为卷添加的原因是,使docker-compose build为您提供可以部署到远程服务器的映像,但其代码在本地开发时仍然可以安装,因此可以实时重新加载。

     

如果您想使用Compose在本地开发应用程序并将其部署到云端,最佳做法是为每个应用程序创建一个文件 - docker-compose.yml用于本地开发和其他内容(例如{{1}用于远程部署 - 并在部署时使用remote.yml标志传递备用文件。

     

您可以使用extends option来减少两个文件之间的重复。

在Windows上,请注意路径及其共享状态:请参阅issue 3157

答案 1 :(得分:1)

对于Windows:

一种解决方案是删除 “ docker-compose.yml” 中的 “卷” 。< / p>

问题是,它不会更新/同步主机中的文件。 (这是我的情况) 我试着玩卷,发现卷中的 “ .. ”。:/ code“ )不起作用。这使我在docker中的代码目录为空。

我建议做的是在 C:/ Users / YourUsername / (可以是更深的目录,只要它在路径下)中传输项目,然后在docker-compose的 volume 参数中,将 “。:// code” 更改为 < em>“ C:/用户/您的用户名/ project_folder:/代码”