我正在尝试创建一个新的Docker镜像,该镜像不再使用来自正在使用图像的正在运行的容器中的卷。卷是使用docker-compose文件而不是Dockerfile创建的。问题是,当我通过新的docker-compose.yml文件启动一个新容器时,它仍然有映射的卷。我仍然需要保留这些卷和使用它们的原始容器/图像。此外,如果可能,我想继续使用相同的泊坞窗图像,只需添加新版本,或:最新。这是我使用的步骤:
现有图片的新版本:
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>
每当我运行这些卷的任意组合时,仍会从原始图像映射卷。所以我的问题是,如何从曾经映射过卷的图像创建一个容器,但我不想再使用这些卷?
修改 我试过的其他事情:
编辑2: 决定重新开始图像。使用基本映像,启动了一个容器,其中包含使用现在无关图像的更新的docker compose文件。运行docker-compose -f up -d - &gt;即使映像没有(并且从未拥有)映射的任何卷,STILL也会映射这些相同的卷,并且当前的docker-compose.yml文件不映射文件。看起来像docker-compose缓存为项目映射的卷。
在docker-compose中搜索缓存选项后,我看到了这篇文章:How to get docker-compose to always re-create containers from fresh images? 这似乎解决了缓存图像而不是容器缓存卷的问题
答案 0 :(得分:3)
根据另一篇SO帖子,我想做的事情是不可能的。为了将来参考,不能将卷附加到图像,然后决定删除它们。必须在没有卷的情况下创建新图像。参考: How to remove configure volumes in docker images
答案 1 :(得分:1)
要删除卷以及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
会删除音量。