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

时间:2017-10-06 11:17:55

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

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

先决条件

主机目录树

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

Dockerfile

FROM busybox:latest
COPY data /data

搬运工-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

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

2 个答案:

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

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

请参阅:Docker-Volume-Docs - “如果启动一个创建新卷的容器,如上所述,并且容器在要挂载的目录中有文件或目录(例如/ app / above),目录的内容将被复制到卷中。“

示例解决方案

给它一个机会。有了下面的结构和内容,请执行以下操作:

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" ]

搬运工-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