我有一个Dockerfile,我用它来创建一个Flask应用程序的容器。它在一个子目录中,因为我有多个Dockerfile和docker-compose文件,我不喜欢它们把项目的根目录弄得乱七八糟。
在本地开发时,我希望使用Docker bind mount将本地目录挂载到容器中,覆盖现有目录。这将允许Flask注意到文件更改并重新加载开发服务器,而无需重新启动Docker容器。
我使用以下命令运行容器:
docker-compose -p myproject -f docker/docker-compose.dev.yml up
绑定装载在此设置下正常工作:
- docker/Dockerfile.dev *
# setup...
WORKDIR /app
COPY . /app # To allow the container to start successfully, before the bind mount is mounted
- 停靠器/停靠器-撰写.dev.yml*
services:
api:
build:
context: ..
dockerfile: ./docker/Dockerfile.dev
volumes:
- ..:/app
// And a bunch of other setup stuff and services
我遵循this helpful tutorial来帮助我的容器瘦身,并采用了Pipenv。它推荐了一个稍微不同的设置,在那里我的容器创建一个用户,而不是以root身份运行所有东西。所以我现在有了这个**,它失败了:**
- docker/Dockerfile.dev *
# setup...
RUN useradd --create-home appuser
WORKDIR /home/appuser
USER appuser
COPY . .
- 停靠器/停靠器-撰写.dev.yml*
services:
api:
build:
context: ..
dockerfile: ./docker/Dockerfile.dev
volumes:
- ..:/home/appuser
// And a bunch of other setup stuff and services
虽然我已经用COPY
命令将所有内容复制到了正确的位置,所以应用程序成功启动,但当我更改主机目录中的文件时,服务器并没有重新加载。
docker run --env-file .env --entrypoint bash --network flasknetwork -v $(PWD):/home/appuser -ti api
然后bind mount就如预期的那样出现了,在容器中隐藏了appuser
的home目录。
我不明白这两种设置之间有什么不同。当使用docker-compose
启动容器时,我如何才能让绑定挂载再次工作?
1条答案
按热度按时间1aaf6o9v1#
所以问题根本不是绑定挂载的问题。我使用了
docker inspect api
,发现挂载工作正常:所以我查了一下Flask autoreloading,我记得只有当
FLASK_ENV
设置为development
时,它才能工作。这个设置在我移动东西的时候被删除了,我没有重新添加它。所以应用程序在生产模式下运行,因此没有自动重新加载。