Docker 更改命名卷的位置

Docker change location of named volumes

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

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

现在,让我们展示一下我工作中的音量 docker-compose-file:

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

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

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

volumes:
    nifi-ingestion-conf:

这是 docker-compose 的一个片段,我想开始工作

在我的容器中,在这种情况下配置如下(我的 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

更大的片段

这里有一个更大的片段,如果 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

这里的环境(只有我们使用的值)

STORAGE_VOLUME_PATH=/mnt/storage/docker_data

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

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

以下 docker-compose 代码段对您不起作用

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

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

You can mount a host path as part of a definition for a single service, and there is no need to define it in the top level volumes key.

But, if you want to reuse a volume across multiple services, then define a named volume in the top-level volumes key.

命名的卷是 managed by docker

If you start a container with a volume that does not yet exist, Docker creates the volume for you.

另外,建议您阅读

更新: 您可能还想阅读 docker nfs volumes