名为卷没有更新的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.yml
和Dockerfile
。 版本:'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命令的预期行为一致。