首页 文章

将静态文件从Docker容器复制到非空命名卷

提问于
浏览
0

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

先决条件:

Host machine directory tree

.
├── 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

步骤顺序:

  • 使用Dockerfile构建 myimagedocker build -t myimage .

  • 检查 myimage 中的新静态文件: docker run myimage ls /data

bar.2.css foo.2.js

  • 运行: docker-compose up -d --build static

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

2 回答

  • 1

    我认为你只是使用 docker build -t myimage . 将新文件与旧文件一起处理

    也许你可以在插入new之前删除以前的数据,通过运行一次性容器? 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:
    
  • 1

    Why - 我相信您正在 static 容器的 /data 文件夹上安装预先存在的卷 myvolume . 这是因为你的 myvolume 已经存在 . 如果 myvolume 不存在, /data 的内容将复制到卷 .

    见:Docker-Volume-Docs - "If you start a container which creates a new volume, as above, and the container has files or directories in the directory to be mounted (such as /app/ above), the directory’s contents will be copied into the volume."

    Sample Solution

    试一试 . 通过以下结构和内容,可以:

    docker-compose up --build
    

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

    您可以装载和检查共享卷,如下所示:

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

    Environment

    文件夹结构:

    .
       ├── 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" ]
    

    泊坞窗,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
    

相关问题