我在一个烧瓶应用程序中有以下文件夹结构,我将其嵌入到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时,它似乎没有注册对文件的任何更改。我错过了什么?
答案 0 :(得分:2)
问题似乎主要是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:/代码”