将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
步骤顺序:
- 使用Dockerfile构build
myimage
:docker build -t myimage .
-
在
myimage
检查新的静态文件:docker run myimage ls /data
bar.2.css foo.2.js
-
运行:
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