为什么docker compose在随机路径中创建卷,而不是在docker-compose.yml中指定的路径?
我正在尝试将nexus数据存储在持久卷中。为此,我正在使用此组合yaml:为什么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
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
...