Docker-compose卷未正确挂载

12
我正在跟随testdriven.io上的Flask/Docker教程。在第一部分的第三个部分Docker Config中,我按照说明将项目目录作为开发环境下Docker容器的卷来加载。不幸的是,按照教程的步骤使用docker-compose不能正确加载卷,而容器内的目录为空。
下面是该容器的。
FROM python:3.6.1

# set working directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# add requirements (to leverage Docker cache)
ADD ./requirements.txt /usr/src/app/requirements.txt

# install requirements
RUN pip install -r requirements.txt

# add app
ADD . /usr/src/app

# run server
CMD python manage.py runserver -h 0.0.0.0

这是 docker-compose.yml 文件。

version: '2.1'

services:

  users-service:
    container_name: users-service
    build: .
    volumes:
      - '.:/usr/src/app'
    ports:
      - 5001:5000 # expose ports - HOST:CONTAINER

所涉及的目录是用户服务容器内的/usr/src/app目录。当我执行以下操作时:
>> docker-compose build 
>> docker-compose up -d
>> docker-compose run users-service bash

当我在容器中使用ls命令时,我处于正确的目录(/usr/src/app),但是该目录为空。这也导致CMD失败,因为它找不到位于项目根目录中的manage.py文件。
我在stackoverflow上看到了一些类似标题的帖子,但是很遗憾,没有一种解决方案能够解决我的问题。我尝试将本地卷路径从相对路径更改为绝对路径,但结果没有任何区别。提前感谢任何能够帮助我的人。
编辑:
在容器上运行docker inspect命令后,以下是在MountsConfig - Volume下找到的信息:
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/jonathan/projects/flask-microservices-users",
                "Destination": "/usr/src/app",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
 ...
 "Config": {
        ...
        "Image": "flaskmicroservicesusers_users-service",
        "Volumes": {
            "/usr/src/app": {}
        },
        "WorkingDir": "/usr/src/app",
        ...

1
我要挂载的目录是项目的根目录。me@ubuntu:~/project$ ls Dockerfile manage.py README.md docker-compose.yml project requirements.txt - Jonnyishman
很遗憾,容器无法保持运行状态。如果没有正确挂载卷,容器内的manage.py文件和项目目录将会丢失,因此无法在运行时持久化。 - Jonnyishman
但您仍然可以在已停止的容器上运行检查。 - user3012759
好的,我已经编辑了我的原始帖子,并附上了docker inspect的结果。 - Jonnyishman
哦,你确定你的路径没有错别字吗?你在~/project中使用了ls,但是inspect中有/home/jonathan/projects/,那里有一个__s__,如果缺少目录,docker会立即在主机上创建它们... - user3012759
显示剩余7条评论
2个回答

4
问题在于,您不能将卷挂载到容器中的现有路径并期望该路径内的数据被同步。这不是 Unix 卷挂载的工作方式。
可以在此处找到解释:
https://github.com/moby/moby/issues/32203
如果您需要使容器内的数据持久化,请查看此处:
https://github.com/moby/moby/issues/4361#issuecomment-36317097

1

1
嗨,Michael,感谢您的建议,不幸的是它并没有解决问题。即使清除了Docker缓存并从头开始,问题仍然存在。我已经编辑了我的原始评论,包括容器上docker compose的结果。 - Jonnyishman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接