我想通过命名卷将新的静态文件从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
步骤顺序:
myimage
:docker build -t myimage .
检查myimage
中的新静态文件:docker run myimage ls /data
bar.2.css foo.2.js
运行:docker-compose up -d --build static
在我看来,它必须重建服务static
并覆盖旧的静态文件。但事实并非如此。为什么以及如何解决它?另外,什么是更好的方法?
答案 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