【问题标题】:Copy static files from Docker container to non empty named volume将静态文件从 Docker 容器复制到非空命名卷
【发布时间】:2018-03-18 04:33:02
【问题描述】:

我想通过命名卷将新的静态文件从 Docker 容器复制到具有旧静态的 nginx 容器。

先决条件

主机目录树

.
├── data
│   ├── bar.2.css
│   └── foo.2.js
├── docker-compose.yml
├── Dockerfile

Dockerfile

FROM busybox:latest
COPY data /data

docker-compose.yml

version: '3'

services:
  static:
    image: 'myimage'
    volumes: 
      - 'myvolume:/data'

  nginx:
    image: 'nginx'
    volumes: 
      - 'myvolume:/data'

volumes:
  myvolume:

具有旧静态的命名卷 myvolume 的目录树:

    .
    ├── bar.1.css
    └── foo.1.js

步骤顺序:

  1. 使用 Dockerfile 构建 myimagedocker build -t myimage .
  2. 检查myimage中的新静态文件:docker run myimage ls /data

    bar.2.css foo.2.js

  3. 运行:docker-compose up -d --build static

在我看来,它必须重建服务static 并覆盖旧的静态文件。但它没有。为什么以及如何解决它?另外,有什么更好的方法?

【问题讨论】:

    标签: docker nginx static docker-compose docker-volume


    【解决方案1】:

    我认为您只是在使用 docker build -t myimage . 处理旧文件和新文件

    也许您可以在插入新数据之前删除以前的数据,方法是运行一次性容器? docker exec -it static rm /data 然后只需复制新数据,或构建新图像:

    docker cp /data static:/data
    

    您也可以在 docker-compose 文件中实现构建步骤:

    version: '3'
    
    services:
      static:
        build: /
        image: 'myimage'
        volumes: 
          - 'myvolume:/data'
    
      nginx:
        image: 'nginx'
        volumes: 
          - 'myvolume:/data'
    
    volumes:
      myvolume:
    

    【讨论】:

      【解决方案2】:

      为什么 -- 我相信您正在将预先存在的卷 myvolume 安装在 static 容器的 /data 文件夹顶部。这是因为您的 myvolume 已经存在。如果myvolume 不存在,/data 的内容将被复制到卷中。

      见:Docker-Volume-Docs -- "如果你启动一个容器,它创建了一个新的卷,如上,并且容器在要挂载的目录中有文件或目录(如上面的/app/),目录的内容将被复制到卷中。”

      示例解决方案

      试一试。用下面的结构和内容做一个:

      docker-compose up --build
      

      这是附加的,因此如果您将内容更新/添加到 newdata 文件夹并重新运行您的撰写,那么新内容将出现在共享卷中。

      您可以像这样挂载和检查共享卷:

      docker run -it --rm --mount type=volume,src={docker-volume-name},target=/shared busybox sh
      

      环境

      文件夹结构:

         .
         ├── dockerfile
         ├── docker-compose.yml
         ├── newdata/
             ── apple.txt
             ── banana.txt
      

      dockerfile

      FROM busybox:latest
      
      # From host machine to image
      COPY newdata/* /newdata/
      
      # @Runtime from image to where a shared volume could be mounted.
      ENTRYPOINT [ "cp", "-r", "/newdata/", "/shared" ]
      

      docker-compose.yml

      version: '3.2'
      
      services:
        data-provider:
          image: data-provider
          build: .
          volumes: 
            - type: volume
              source: so
              target: /shared
      
        destination:
          image: busybox:latest
          volumes: 
            - type: volume
              source: so
              target: /shared-data
          depends_on: 
            - data-provider
          command: ls -la /shared-data/newdata
      
      volumes:
        so:
      

      样本输出:

      $ docker-compose up --build
      Creating volume "sodockervol_so" with default driver
      Building data-provider
      Step 1/3 : FROM busybox:latest
       ---> c75bebcdd211
      Step 2/3 : COPY newdata/* /newdata/
       ---> bc85fc19ed7b
      Removing intermediate container 2a39f4be8dd2
      Step 3/3 : ENTRYPOINT cp -r /newdata/ /shared
       ---> Running in e755c3179b4f
       ---> 6e79a32bf668
      Removing intermediate container e755c3179b4f
      Successfully built 6e79a32bf668
      Successfully tagged data-provider:latest
      Creating sodockervol_data-provider_1 ...
      Creating sodockervol_data-provider_1 ... done
      Creating sodockervol_destination_1 ...
      Creating sodockervol_destination_1 ... done
      Attaching to sodockervol_data-provider_1, sodockervol_destination_1
      destination_1    | total 16
      destination_1    | drwxr-xr-x    2 root     root          4096 Oct  9 17:50 .
      destination_1    | drwxr-xr-x    3 root     root          4096 Oct  9 17:50 ..
      destination_1    | -rwxr-xr-x    1 root     root            25 Oct  9 17:50 apple.txt
      destination_1    | -rwxr-xr-x    1 root     root            28 Oct  9 17:50 banana.txt
      sodockervol_data-provider_1 exited with code 0
      sodockervol_destination_1 exited with code 0
      

      【讨论】:

      • @A.Innokentiev -- 如果您仍然对这个问题感兴趣,我提供了一个更完整的示例答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多