我正在尝试创建一个新的Docker镜像,该镜像不再使用来自正在使用图像的正在运行的容器中的卷 . 卷是使用docker-compose文件而不是Dockerfile创建的 . 问题是,当我通过新的docker-compose.yml文件启动一个新容器时,它仍然有映射的卷 . 我仍然需要保留这些卷和使用它们的原始容器/图像 . 另外,如果可能的话,我想继续使用相同的docker镜像,只需添加新版本,或者:最新版本 . 这是我使用的步骤:
现有图像的新版本:
docker commit <image id> existingImage:new-version
从当前运行的容器创建一个新图像:
docker commit <Image ID> newimage
创建没有定义卷的新docker-compose.yml,并使用不同的项目名称运行docker-compose
docker-compose -p <new project name>
在没有docker-compose的情况下运行,只需使用docker run:
docker run -d -p 8093:80 <img>:<version>
每当我运行这些卷的任何组合时,仍然会从原始图像映射卷 . 所以我的问题是,如何从曾经映射过卷的图像创建一个容器,但我不想再使用这些卷了?
Edit: 我试过的其他事情:
- 停止容器,删除容器,重新启动docker,再次运行docker compose . 没运气 .
Edit 2: 决定重新开始拍摄 . 使用基本映像,启动了一个容器,其中包含使用现在不相关图像的更新的docker compose文件 . 运行docker-compose -f up -d - > STILL映射了相同的卷,即使映像没有(并且从未拥有)任何映射的卷,并且当前的docker-compose.yml文件也不映射文件 . 看起来像docker-compose缓存为项目映射的卷 .
在docker-compose中搜索缓存选项后,我遇到了这篇文章:How to get docker-compose to always re-create containers from fresh images?这似乎解决了缓存图像的问题,但没有解决容器缓存卷的问题
2 回答
根据另一篇SO帖子,我想做的事情是不可能的 . 为了将来参考,不能将卷附加到图像,然后决定删除它们 . 必须在没有卷的情况下创建新映像 . 参考:How to remove configure volumes in docker images
要删除卷以及
docker-compose
使用的容器,请使用docker-compose down -v
.要使用
docker-compose
启动容器,保持现有卷不变,但不使用这些卷,则应更改项目名称 . 您可以使用docker-compose -p new_project_name up -d
.编辑:这是一个示例,显示docker-compose如何不在不同项目之间重用命名卷,但它确实重用并保留卷,除非您执行
down -v
:现在已填充卷,让我们停止并启动一个新容器以显示它仍然存在:
有预期的持久性卷,让我们同时运行一个不同的项目来显示卷是独立的:
新项目中的卷完全为空 . 让我们清理一下 .
请注意,之前的proj1中有音量 .
但是做一个
down -v
会删除音量 .