为什么 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
之前,我创建了 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 在另一个路径中创建卷?
您定义了一个卷而不是绑定安装,这正是您想要的。阅读有关它的 documentation。
基本上,您的配置使 docker 创建一个 volume
,它映射到 /var/lib/docker/volumes
.
下某处随机创建的目录
如果你想要一个你控制的特定目录,你必须创建一个bind
。这就是您在所选目录中没有数据的原因,因为 docker 会忽略它,因为它对 volume
.
没有用
要使其正常工作,请将其设置为:
volumes:
- type: bind
source: ./nexus-data
target: /nexus-data
如撰写中所述documentation。 (还从该配置中删除了图像名称)
您已经创建了一个主机卷,又名绑定安装(它没有显示在 docker volume ls
中,因为它不是命名卷)B 从主机上的 ./nexus-data
到 /nexus-data sonatype/nexus3
容器内。这看起来像是来自 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
规范中的尾随 sonatype/nexus3
:
...
volumes:
- ./nexus-data:/nexus-data sonatype/nexus3
...
... 关闭 docker
- 根据 sonatype/nexus3
Dockerfile
中的 VOLUME
指令创建随机命名的卷并安装到 运行容器因此为什么预期的本地安装目录是空的。
我正在尝试将 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
之前,我创建了 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 在另一个路径中创建卷?
您定义了一个卷而不是绑定安装,这正是您想要的。阅读有关它的 documentation。
基本上,您的配置使 docker 创建一个 volume
,它映射到 /var/lib/docker/volumes
.
如果你想要一个你控制的特定目录,你必须创建一个bind
。这就是您在所选目录中没有数据的原因,因为 docker 会忽略它,因为它对 volume
.
要使其正常工作,请将其设置为:
volumes:
- type: bind
source: ./nexus-data
target: /nexus-data
如撰写中所述documentation。 (还从该配置中删除了图像名称)
您已经创建了一个主机卷,又名绑定安装(它没有显示在 docker volume ls
中,因为它不是命名卷)B 从主机上的 ./nexus-data
到 /nexus-data sonatype/nexus3
容器内。这看起来像是来自 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
规范中的尾随 sonatype/nexus3
:
...
volumes:
- ./nexus-data:/nexus-data sonatype/nexus3
...
... 关闭 docker
- 根据 sonatype/nexus3
Dockerfile
中的 VOLUME
指令创建随机命名的卷并安装到 运行容器因此为什么预期的本地安装目录是空的。