docker 当绑定装载目录中的代码发生更改时,Flask未在容器内自动重新加载

xxls0lw8  于 2022-11-28  发布在  Docker
关注(0)|答案(1)|浏览(124)

我有一个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启动容器时,我如何才能让绑定挂载再次工作?

1aaf6o9v

1aaf6o9v1#

所以问题根本不是绑定挂载的问题。我使用了docker inspect api,发现挂载工作正常:

"Mounts": [
    {
        "Type": "bind",
        "Source": "/Users/myuser/src/project",
        "Destination": "/home/appuser",
        "Mode": "rw",
        "RW": true,
        "Propagation": "rprivate"
    }
],

所以我查了一下Flask autoreloading,我记得只有当FLASK_ENV设置为development时,它才能工作。这个设置在我移动东西的时候被删除了,我没有重新添加它。所以应用程序在生产模式下运行,因此没有自动重新加载。

相关问题