Docker撰写重用卷

时间:2017-10-31 19:47:38

标签: docker docker-compose

我正在尝试创建一个新的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>

每当我运行这些卷的任意组合时,仍会从原始图像映射卷。所以我的问题是,如何从曾经映射过卷的图像创建一个容器,但我不想再使用这些卷?

修改 我试过的其他事情:

  • 停止容器,移除容器,重新启动docker,再次运行docker compose。没有运气。

编辑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? 这似乎解决了缓存图像而不是容器缓存卷的问题

2 个答案:

答案 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会删除音量。