Docker命名卷未更新

Shu*_*pli 12 docker docker-compose docker-volume

我对如何使用命名数据卷(不是数据容器)感到困惑.

我有一个命名数据卷app_src,/usr/src/app使用docker compose文件挂载.但是,在对我的源代码(本地)进行更改后,构建映像不会更新卷.

我正在构建这样的图像,

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

为了确认卷没有改变,我附加到正在运行的容器中,并且确实没有更新源代码.

这是我的docker撰写文件development.ymlDockerfile我的web服务.版本:'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
Run Code Online (Sandbox Code Playgroud)

我可以通过像这样安装主机来使它工作,

volumes:
    - ./web/src:/usr/src/app
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 16.04上运行docker 1.11.2.我的理解错了吗?我确实看了一下文档,但是我能找到任何能很好地解释音量的东西.

BMi*_*tch 9

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

如果要更新命名卷,请考虑使用侧容器:

docker run -v app_src:/target -v `pwd`/web/src:/source --rm \
  busybox /bin/sh -c "tar -cC /source . | tar -xC /target"
Run Code Online (Sandbox Code Playgroud)

您可以根据需要运行该容器以更新指定的卷.git clone如果要对大型存储库进行小的更改,还可以将tar替换为从源存储库中提取的内容,或者甚至是rsync(您需要在映像上安装).

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