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

我想通过命名卷从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构buildmyimagedocker build -t myimage .
  2. myimage检查新的静态文件: docker run myimage ls /data

    bar.2.css foo.2.js

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

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

我认为你只是应付与docker build -t myimage .的旧文件一起的新文件docker build -t myimage .

也许你可以通过运行一次性容器来删除之前的数据,然后再插入新的数据? docker exec -it static rm /data ,然后只是复制新的数据,或build立新的形象:

 docker cp /data static:/data 

你也可以在Docker-compose文件中实现构build步骤:

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

为什么 – 我相信你正在将预先存在的卷myvolume放在static容器的/data文件夹上。 这是因为你的myvolume已经存在。 如果myvolume不存在,则/data的内容将被复制到该卷。

请参阅: Docker-Volume-Docs – “如果启动一个创build新卷的容器(如上所述),并且容器在要装入的目录中具有文件或目录(如/ app / above),则目录的内容将会被复制到音量“。

示例解决scheme

给这个一个镜头。 下面的结构和内容做一个:

 docker-compose up --build 

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

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

 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