Docker命名卷未更新

时间:2016-07-18 15:54:56

标签: docker docker-compose docker-volume

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

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

我正在构建这样的图像,

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

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

这是我的development.yml服务的docker撰写文件Dockerfileweb。 版本:'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。我的理解错了吗?我确实看了一下文档但是我能找到任何能很好地解释音量的东西。

3 个答案:

答案 0 :(得分: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"

您可以根据需要运行该容器以更新您的指定卷。如果要对大型存储库进行小的更改,还可以使用类似git clone的内容替换tar来源源存储库,甚至是rsync(需要在映像上安装)。

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

答案 1 :(得分:1)

将卷多次装入同一个地方。 第一次容器将数据存储到主机文件系统中,第二次它将数据INTO容器覆盖到主机文件系统。 从docker-compose文件中删除卷装入

//faculty get users by department// Route::get('faculty/dept/{department}', 'FacultyController@getAllDept' );

您可以获得更多信息here

  

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

     

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

答案 2 :(得分:0)

一种解决方法是,如果您可以承受更长的停机时间,当然可以重新创建该卷:

docker-compose down && docker volume rm <VOLUME_NAME> && docker-compose up -d