我想通过命名卷将新的静态文件从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构建
myimage
:docker build -t myimage .
-
检查
myimage
中的新静态文件:docker run myimage ls /data
bar.2.css foo.2.js
- 运行:
docker-compose up -d --build static
在我看来,它必须重建服务 static
并覆盖旧的静态文件 . 但事实并非如此 . 为什么以及如何解决它?另外,什么是更好的方法?
2 回答
我认为你只是使用
docker build -t myimage .
将新文件与旧文件一起处理也许你可以在插入new之前删除以前的数据,通过运行一次性容器?
docker exec -it static rm /data
然后只需复制新数据,或构建新图像:您还可以在docker-compose文件中实现构建步骤:
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
试一试 . 通过以下结构和内容,可以:
这是附加的,因此如果您更新/添加内容到
newdata
文件夹并重新运行您的撰写,则新内容将出现在共享卷中 .您可以装载和检查共享卷,如下所示:
Environment
文件夹结构:
dockerfile
泊坞窗,compose.yml
样本输出: