为什么docker compose在随机路径中创建卷,而不是在docker-compose.yml中指定的路径?

为什么docker compose在随机路径中创建卷,而不是在docker-compose.yml中指定的路径?,docker,docker-compose,docker-volume,sonatype,nexus3,Docker,Docker Compose,Docker Volume,Sonatype,Nexus3,我正在尝试将nexus数据存储在持久卷中。为此,我正在使用此组合yaml: version: '3.5' services: nexus: image: sonatype/nexus3 volumes: - ./nexus-data:/nexus-data sonatype/nexus3 ports: - "8081:8081" networks: - devops extra_hosts: - "m

我正在尝试将nexus数据存储在持久卷中。为此,我正在使用此组合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
之前,我已经创建了
nexus data
文件夹,并按照此处的建议为
uid/guid 200
授予了所需的权限:

这里是docker在运行compose文件之前的卷列表(为空):

在执行
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
但是我在compose file(
nexus data
)中指定的文件夹仍然是空的:

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

那么,我做错了什么?为什么nexus data为空,docker在另一个路径中创建卷?

您定义了一个卷,而不是您想要的绑定装载。阅读有关它的文章

基本上,您的配置使docker创建一个
,该卷映射到
/var/lib/docker/volumes
下随机创建的目录

如果您想要控制一个特定的目录,您必须创建一个
bind
。这就是您在所选目录中没有数据的原因,因为docker会忽略它,因为它对
没有用处

要使其工作,请将其设置为:

卷:
-类型:绑定
资料来源:/nexus数据
目标:/nexus数据

正如文章中所解释的。(还从该配置中删除了映像名称)

您已经从主机上的
/nexus data
创建了一个主机卷,也称为绑定装载(由于它不是命名卷,所以在
docker volume ls
中不显示)。这看起来像是
docker run
命令中的复制粘贴错误,因为您正在将图像名称添加到容器内装载的路径中。您应该能够执行到容器中,并通过以下方式查看您的文件:

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
spec中的尾随
sonatype/nexus3

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

。。。抛出
docker
关闭-根据
sonatype/nexus3
Dockerfile
中的
volume
指令创建随机命名的卷,并将其装载到正在运行的容器中,因此预期的本地装载目录为空。

卷中的容器侧路径中有一个空格:
指令;正确吗?像这样声明卷
-/nexus data:/nexus data
。在正式文档中,有使用普通docker命令
docker run-d-p 8081:8081--name nexus-v nexus data:/nexus data sonatype/nexus3
。卷部分是
-v nexus data:/nexus data
,但不是图像的名称
sonatype/nexus3
。感谢您的宝贵意见,将路径更改为./nexus data:/nexus data解决了我的问题。如果你考虑写一个答案作为你的评论,我可以接受。leopalI使用了这篇博文中的指南:和这篇报道:但事实证明,该指南存在一些问题。更新路径为./nexus data:/nexus data解决了我的问题。我投了反对票,因为OP的问题是“……我在这里做错了什么?为什么nexus数据是空的,docker在另一个路径中创建卷?”你的回答中没有提到这些。我使用了这篇博文中的指南:和这篇报道:但结果表明,指南有一些问题。将路径更新为./nexus data:/nexus data解决了我的问题。@samthegolden points用于最近一次编辑。注意:
/path:/path
类型为
bind
(相当于显式)。谢谢,我使用的指南似乎有一些问题。更新路径解决了我的问题。@不管是谁否决了投票,有什么原因吗?“仅仅因为”而否决投票是不具建设性的,不是我。我对你的答案投了赞成票。非常感谢。
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
    ...
    volumes:
       - ./nexus-data:/nexus-data sonatype/nexus3
    ...