名为卷没有更新的Docker

我很困惑如何使用命名的数据卷(而不是数据容器)。

我有一个使用app_src撰写文件挂载到/usr/src/app的命名数据卷app_src 。 但是,在更改我的源代码(本地)之后,构build映像不会更新卷。

我正在像这样构build图像,

docker-compose -f development.yml build并运行它docker-compose -f development.yml up -d

为了确认音量没有改变,我将其附加到正在运行的容器中,并且足够真实,源代码不会更新。

这里是我的web服务的Dockerfile撰写文件development.ymlDockerfile 。 版本:'2'

 services: web: restart: always build: ./web expose: - "8000" volumes: - app_src:/usr/src/app links: - postgres:postgres env_file: development.env command: ./start_web.sh volumes: app_src: {} FROM python:3.4.4 WORKDIR /usr/src/app RUN rm -rf /usr/src/app/* COPY . /usr/src/app/ RUN pip install --no-cache-dir -r requirements.txt 

我可以像安装主机一样工作,

 volumes: - ./web/src:/usr/src/app 

我在Ubuntu 16.04上运行docker 1.11.2。 我的理解错了吗? 我确实看了一下文档,但是我可以find任何能够很好地解释这个数量的东西。

它看起来像试图使用docker-compose命名卷装入和Dockerfile来修改该位置的内容。 这不会工作,因为Dockerfile正在创build一个图像。 docker-compose定义了运行在该映像之上的运行容器。 您将无法修改图像创build中的卷,因为只有在创build图像并运行该容器后才会装入该卷。

如果你想更新你的命名卷,考虑一个侧面容器:

 docker run -v app_src:/target -v `pwd`/web/src:/source --rm \ busybox /bin/sh -c "tar -cC /source . | tar -xC /target" 

您可以按需运行该容器来更新您的命名卷。 你也可以使用像git clone这样的东西来replacetar,以便从一个源代码库,甚至是一个rsync(你需要在你的映像上安装),如果你正在对一个大的版本库进行一些小的修改。

您也可以通过清空命名卷(rm -rf / vol / dir或删除卷并创build新卷)来解决此问题,然后重新启动容器。 在容器启动时,如果包含空的已命名卷,则默认情况下将该位置的图像内容复制到卷中。

你多次把音量挂在同一个地方。 第一次容器将数据存储到主机文件系统中,第二次将容器中的数据INTO容器从主机文件系统中取出。 从你的docker-compose文件中移除卷装

volumes: - ./web/src:/usr/src/app #remove this!

你可以在这里获得更多信息

$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

该命令将主机目录/ src / webapp安装到/ opt / webapp的容器中。 如果path/ opt / webapp已经存在于容器的映像中,那么/ src / webapp挂载会覆盖,但不会删除原有的内容。 一旦挂载被删除,内容可以再次访问。 这与mount命令的预期行为一致。