Docker组成重用卷

我正在尝试创build一个新的Docker镜像,该镜像不再使用使用图像的运行容器中的卷。 卷是使用docker-compose文件创build的,而不是Dockerfile。 问题是,当我通过新的docker-compose.yml文件启动一个新的容器时,它仍然有映射的卷。 我仍然需要保留这些卷和使用它们的原始容器/图像。 另外,如果可能的话,我想继续使用相同的docker图像,只需添加一个新的版本,或:最新的。 以下是我使用的步骤:

现有图片的新版本:

docker commit <image id> existingImage:new-version 

从当前运行的容器创build一个新的图像:

 docker commit <Image ID> newimage 

创build没有定义卷的新的docker-compose.yml,并用不同的项目名称运行docker-compose

 docker-compose -p <new project name> 

在没有docker-compose的情况下运行,只需使用docker run:

  docker run -d -p 8093:80 <img>:<version> 

任何时候,我运行这些卷的任何组合仍然映射从原始图像。 所以我的问题是,如何从已经映射了卷的映像创build容器,但不再想要使用这些卷?

编辑:我试过的其他东西:

  • 停止容器,取出容器,重新启动Docker,再运行Docker组合。 没有运气。

编辑2:决定重新开始在图像上。 使用一个基本的图像,启动一个容器与更新的docker合成文件,使用现在不相关的图像。 运行docker-compose -f up -d – >即使映像没有映射(并且从不具有)映射的卷,也会映射这些相同的卷,并且当前的docker-compose.yml文件不映射文件。 它看起来像docker构成caching项目映射的卷。

在docker-compose中searchcaching选项后,我遇到了这篇文章: 如何让docker-compose始终从新鲜图像重新创build容器? 这似乎解决了caching图像的问题,而不是容器caching卷

根据另一个SOpost,我想要做的是不可能的。 为了将来的参考,不能将卷附加到图像,然后决定删除它们。 必须创build一个没有卷的新映像。 参考: 如何删除泊坞窗镜像中的configuration卷

要删除容器以及docker-compose使用的容器,请使用docker-compose down -v

要使用docker-compose启动容器,请保留现有的卷,但不要使用这些卷,则应更改项目名称。 你可以使用docker-compose -p new_project_name up -d


编辑:下面是一个示例,显示docker-compose如何不在不同项目之间重复使用命名卷,但除非使用down -v否则会重用和保留卷:

 $ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d Creating network "proj1_default" with the default driver Creating volume "proj1_data" with default driver Creating proj1_test_1 ... Creating proj1_test_1 ... done $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 71f2eb516f71 busybox "tail -f /dev/null" 5 seconds ago Up 2 seconds proj1_test_1 $ docker exec -it 71f /bin/sh / # ls /data / # echo "Hello proj1" >/data/data.txt / # exit 

卷现在已经填充,让我们停下来,并开始一个新的容器来显示它坚持:

 $ docker-compose -p proj1 -f docker-compose.vol-named.yml down Stopping proj1_test_1 ... done Removing proj1_test_1 ... done Removing network proj1_default $ docker-compose -p proj1 -f docker-compose.vol-named.yml up -d Creating network "proj1_default" with the default driver Creating proj1_test_1 ... Creating proj1_test_1 ... done $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 311900fd3d27 busybox "tail -f /dev/null" 5 seconds ago Up 3 seconds proj1_test_1 $ docker exec -it 311 /bin/sh / # cat /data/data.txt Hello proj1 / # exit 

有预期的持续音量,让我们同时运行一个不同的项目来显示音量是独立的:

 $ docker-compose -p proj2 -f docker-compose.vol-named.yml up -d Creating network "proj2_default" with the default driver Creating volume "proj2_data" with default driver Creating proj2_test_1 ... Creating proj2_test_1 ... done $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d39e6fc51436 busybox "tail -f /dev/null" 4 seconds ago Up 2 seconds proj2_test_1 311900fd3d27 busybox "tail -f /dev/null" 33 seconds ago Up 32 seconds proj1_test_1 $ docker exec -it d39 /bin/sh / # ls -al /data total 8 drwxr-xr-x 2 root root 4096 Nov 6 19:56 . drwxr-xr-x 1 root root 4096 Nov 6 19:56 .. / # exit 

新项目中的音量是完全空的。 让我们清理。

 $ docker-compose -p proj2 -f docker-compose.vol-named.yml down -v Stopping proj2_test_1 ... Stopping proj2_test_1 ... done Removing proj2_test_1 ... done Removing network proj2_default Removing volume proj2_data $ docker volume ls DRIVER VOLUME NAME local proj1_data 

请注意,proj1中的音量来自之前。

 $ docker-compose -p proj1 -f docker-compose.vol-named.yml down -v Stopping proj1_test_1 ... done Removing proj1_test_1 ... done Removing network proj1_default Removing volume proj1_data $ docker volume ls DRIVER VOLUME NAME 

但是做一个down -v删除音量。