簡體   English   中英

為什么 docker-compose 在隨機路徑中創建卷而不是我在 docker-compose.yml 中指定的路徑?

[英]Why is docker-compose creating volume in random path instead of the path I specified in docker-compose.yml?

我正在嘗試將 nexus 數據存儲在持久卷中。 為此,我使用了這個 compose yaml:

version: '3.5'

services:
  nexus:
    image: sonatype/nexus3
    volumes:
       - ./nexus-data:/nexus-data sonatype/nexus3
    ports:
      - "8081:8081"
    networks:
      - devops
    extra_hosts:
      - "my-proxy:my-proxy-address"
    restart: on-failure

networks:
  devops:
    name: devops
    driver: bridge

在運行docker-compose up之前docker-compose up我已經創建了nexus-data文件夾,並按照此處的建議為uid/guid 200提供了所需的權限:

https://github.com/sonatype/docker-nexus3/blob/master/README.md#persistent-data

root@master-node:~/docker# ll
total 16
drwxr-xr-x  3 root root 4096 Jan  8 13:37 ./
drwx------ 22 root root 4096 Jan  8 13:40 ../
-rw-r--r--  1 root root  319 Jan  8 13:36 docker-compose.yml
drwxr-xr-x  2  200  200 4096 Jan  8 13:37 nexus-data/

在運行撰寫文件之前,這里是 docker 的卷列表(它是空的):

root@master-node:~/docker# docker volume ls
DRIVER              VOLUME NAME

docker-compose up命令之后,docker 創建了如下圖所示的卷:

root@master-node:~/docker# docker volume ls
DRIVER              VOLUME NAME
local               7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b
root@master-node:~/docker# docker volume inspect  7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b 
[
    {
        "CreatedAt": "2020-01-08T13:42:34+03:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b/_data",
        "Name": "7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b",
        "Options": null,
        "Scope": "local"
    }
]
root@master-node:~/docker# ls /var/lib/docker/volumes/7b7b6517e5ed0e286a8fc7caef756141b5bbdb6e074ef93a657850da3dd78b2b/_data
admin.password  cache  db  elasticsearch  etc  generated-bundles  instances  javaprefs  karaf.pid  keystores  lock  log  orient  port  restore-from-backup  tmp

但是我在撰寫文件( nexus-data )中指定的文件夾仍然是空的:

root@master-node:~/docker# ls nexus-data/
root@master-node:~/docker# 

那么,我在這里做錯了什么? 為什么nexus-data空並且 docker 在另一條路徑中創建卷?

您定義了一個卷而不是綁定安裝,這正是您想要的。 閱讀有關它的文檔

基本上,您的配置使 docker 創建一個volume ,它映射到/var/lib/docker/volumes下某處隨機創建的目錄。

如果你想要一個你控制的特定目錄,你必須創建一個bind 這就是您在所選目錄中沒有數據的原因,因為 docker 會忽略它,因為它對volume沒有用。

要使其正常工作,請將其設置為:

    volumes:
      - type: bind
        source: ./nexus-data
        target: /nexus-data

如撰寫文檔中所述 (還從該配置中刪除了圖像名稱)

您已經創建了一個主機卷,又名綁定安裝(它沒有顯示在docker volume ls因為它不是命名卷)B 從./nexus-data上的/nexus-data sonatype/nexus3到容器內的/nexus-data sonatype/nexus3 這看起來像是來自docker run命令的復制和粘貼錯誤,因為您將圖像名稱添加到安裝在容器內的路徑中。 您應該能夠 exec 進入容器並查看您的文件:

docker exec ... ls "/nexus-data sonatype/nexus3"

您應該從卷路徑中刪除映像名稱以掛載容器內的典型位置:

version: '3.5'

services:
  nexus:
    image: sonatype/nexus3
    volumes:
       - ./nexus-data:/nexus-data
    ports:
      - "8081:8081"
    networks:
      - devops
    extra_hosts:
      - "my-proxy:my-proxy-address"
    restart: on-failure

networks:
  devops:
    name: devops
    driver: bridge

您確實看到的卷是匿名卷。 這將來自定義您未包含在容器規范中的卷的圖像本身。 使用該卷檢查容器將顯示它的安裝位置,最有可能在/nexus-data

下面docker-compose.yaml按預期工作:

version: '3.5'

services:
  nexus:
    image: sonatype/nexus3
    volumes:
       - ./nexus-data:/nexus-data
    ports:
      - "8081:8081"
    networks:
      - devops
    extra_hosts:
      - "my-proxy:my-proxy-address"
    restart: on-failure

networks:
  devops:
    name: devops
    driver: bridge

原始docker-compose.yaml規范中的尾隨sonatype/nexus3

    ...
    volumes:
       - ./nexus-data:/nexus-data sonatype/nexus3
    ...

...拋出docker off - 隨機命名的卷是根據sonatype/nexus3 DockerfileVOLUME指令創建的,並安裝到正在運行的容器中,因此為什么預期的本地安裝目錄為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM