【问题标题】:Docker change location of named volumesDocker更改命名卷的位置
【发布时间】:2021-03-28 21:19:36
【问题描述】:

我有一个我无法理解的问题。我正在使用 docker 来运行某些容器,但我至少有一个卷有问题,我不想问是否有人可以给我提示我做错了什么。我以 Nifi-Ingestion 为例,但它会影响更多的容器体积。

首先说一下我使用的版本:

  • Docker 版本 19.03.8,构建 afacb8b7f0
  • docker-compose 版本 1.27.4,构建 40524192
  • Ubuntu 20.04.1 LTS

现在,让我们在我的工作 docker-compose-file 中显示卷:

在我的容器中,配置如下:

volumes:
    - nifi-ingestion-conf:/opt/nifi/nifi-current/conf

在我的 docker-compose 文件下面,它被定义为一个普通的命名卷:

volumes:
    nifi-ingestion-conf:

这是我想要开始工作的 docker-compose 的 sn-p

在我的容器中,在这种情况下配置如下(我的 STORAGE_VOLUME_PATH 定义为 /mnt/storage/docker_data):

volumes:
    - ${STORAGE_VOLUME_PATH}/nifi-ingestion-conf:/opt/nifi/nifi-current/conf

在底部,我想有一些事情要做,但我不知道我需要在这里做什么。在这种情况下,它与工作中的 docker-compose 相同:

volumes:
    nifi-ingestion-conf:

那么,现在我的问题是什么?

我有两个 docker-compose 文件。一个使用普通的命名卷,一个使用我的额外挂载路径中的卷。当我运行容器时,卷的工作方式似乎有所不同,因为文件是用第一种风格编写的,而不是第二种风格。我的挂载路径是在第二个版本中生成的,所以我在 .env 文件中的环境变量没有任何问题。

提示:/mnt/storage/docker_data 是 NFS 挂载,但我的机器拥有该共享的全部权限。

这是我挂载该卷的 fstab 条目(也许我必须设置其他选项):

10.1.0.2:/docker/data               /mnt/storage/docker_data        nfs     auto,rw

更大的 sn-ps

如果 docker-compose(我需要剪切和删除有信心的数据,我的问题不是它不起作用,只是卷的行为不同。这一卷的所有内容都在代码。):

version: "3"
services:
    nifi-ingestion:
        image: my image on my personal repo
        container_name: nifi-ingestion
        ports:
            - 0000
        labels:
            - app-specivic
        volumes:
            - ${STORAGE_VOLUME_PATH}/nifi-ingestion-conf:/opt/nifi/nifi-current/conf
            #working: - nifi-ingestion-conf:/opt/nifi/nifi-current/conf
        environment:
            - app-specivic
        networks:
            - cnetwork

volumes:
    nifi-ingestion-conf:

networks:
    cnetwork:
        external: false
        ipam:
            driver: default
            config:
                - subnet: 192.168.1.0/24

这里的 env (只有我们正在使用的值)

STORAGE_VOLUME_PATH=/mnt/storage/docker_data

【问题讨论】:

    标签: docker docker-compose volumes


    【解决方案1】:

    如果我正确理解您的问题,您想知道为什么以下 docker-compose sn-p 对您有用

    version: "3"
    services:
      nifi-ingestion:
        volumes:
           - nifi-ingestion-conf:/opt/nifi/nifi-current/conf
    volumes:
      nifi-ingestion-conf:
    

    下面的 docker-compose sn-p 对你不起作用

    version: "3"
    services:
      nifi-ingestion:
        volumes:
          - ${STORAGE_VOLUME_PATH}/nifi-ingestion-conf:/opt/nifi/nifi-current/conf
    

    它们的不同之处在于您使用卷的方式。你需要区分mount host paths and mount named volumes

    您可以将主机路径挂载为单个服务定义的一部分,无需在顶级volumes 键中定义它。

    但是,如果您想跨多个服务重用一个卷,请在顶级 volumes 键中定义一个命名卷。

    命名卷为managed by docker

    如果您使用尚不存在的卷启动容器,Docker 会为您创建卷。

    另外,建议您阅读this answer

    更新: 您可能还想了解docker nfs volumes

    【讨论】:

    • 您好,抱歉,复制粘贴失败。我纠正了它,因为它确实如此。这是用于卷的所有行。我的问题不在于该文件包含语法错误,而在于没有定义安装路径(使用 /var/lib/docker)的命名卷与我使用绝对路径时的行为不同
    • 我只是不想将这个 docker-compose 中的容器中的卷放在 /var/lib/docker 中,因为如果硬盘驱动器发生故障,数据会丢失。而且我希望能够设置一个新服务器,只需挂载该目录并启动容器,它们就可以使用这些卷。我已经写了一个清理脚本来确保数据是有效的。通过手动复制数据,它甚至可以工作。
    • @25x14:你的问题不清楚。您想将主机上的 nfs 卷挂载到容器中还是在 nfs 之上创建一个命名卷?
    • nfs-volume 安装在主机上。我想在已挂载的目录中命名卷。
    • 您好,很抱歉回复晚了。我只想有一个命名卷,但定义它的物理位置(我有一个带有小硬盘驱动器的 docker-host 和一个带有我需要的存储的已安装共享)。原因是当我的 docker-host 发生故障时数据不会丢失,并且在我更换 docker-host 时可以轻松地重新使用。容器本身没有问题。
    猜你喜欢
    • 2017-02-07
    • 2020-07-10
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2018-05-26
    • 2016-10-08
    相关资源
    最近更新 更多