首页 文章

Docker构成重用卷

提问于
浏览
7

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

  • 3

    根据另一篇SO帖子,我想做的事情是不可能的 . 为了将来参考,不能将卷附加到图像,然后决定删除它们 . 必须在没有卷的情况下创建新映像 . 参考:How to remove configure volumes in docker images

  • 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 会删除音量 .

相关问题