docker compose挂载的卷为空,但在docker镜像构建期间创建的其他卷已填充



从一个空目录开始,我创建了这个docker-compose.yml:

version: '3.9'
services:
neo4j:
image: neo4j:3.2
restart: unless-stopped
ports:
- 7474:7474
- 7687:7687
volumes:
- ./conf:/conf
- ./data:/data
- ./import:/import
- ./logs:/logs
- ./plugins:/plugins
environment:
# Raise memory limits
- NEO4J_dbms_memory_pagecache_size=1G
- NEO4J_dbms.memory.heap.initial_size=1G
- NEO4J_dbms_memory_heap_max__size=1G

然后我添加import目录,其中包含我打算在容器中使用的数据文件。

此时,我的目录如下:

0 drwxr-xr-x   9 cc  staff  288 Dec 11 18:57 .
0 drwxr-xr-x   5 cc  staff  160 Dec 11 18:15 ..
8 -rw-r--r--   1 cc  staff  458 Dec 11 18:45 docker-compose.yml
0 drwxr-xr-x  20 cc  staff  640 Dec 11 18:57 import

我运行docker-compose up -d --build,容器就构建好了。现在本地目录如下:

0 drwxr-xr-x   9 cc  staff  288 Dec 11 18:57 .
0 drwxr-xr-x   5 cc  staff  160 Dec 11 18:15 ..
0 drwxr-xr-x   2 cc  staff   64 Dec 11 13:59 conf
0 drwxrwxrwx@  4 cc  staff  128 Dec 11 18:08 data
8 -rw-r--r--   1 cc  staff  458 Dec 11 18:45 docker-compose.yml
0 drwxr-xr-x  20 cc  staff  640 Dec 11 18:57 import
0 drwxrwxrwx@  3 cc  staff   96 Dec 11 13:59 logs
0 drwxr-xr-x   3 cc  staff   96 Dec 11 15:32 plugins

创建confdatalogsplugins目录。

datalogs是根据Neo4j图像的构建填充的,并且confplugins是空的,正如预期的那样。

我使用docker exec查看容器上的目录结构:

8 drwx------    1 neo4j    neo4j         4096 Dec 11 23:46 .
8 drwxr-xr-x    1 root     root          4096 May 11  2019 ..
36 -rwxrwxrwx    1 neo4j    neo4j        36005 Feb 18  2019 LICENSE.txt
128 -rwxrwxrwx    1 neo4j    neo4j       130044 Feb 18  2019 LICENSES.txt
12 -rwxrwxrwx    1 neo4j    neo4j         8493 Feb 18  2019 NOTICE.txt
4 -rwxrwxrwx    1 neo4j    neo4j         1594 Feb 18  2019 README.txt
4 -rwxrwxrwx    1 neo4j    neo4j           96 Feb 18  2019 UPGRADE.txt
8 drwx------    1 neo4j    neo4j         4096 May 11  2019 bin
4 drwxr-xr-x    2 neo4j    neo4j         4096 Dec 11 23:46 certificates
8 drwx------    1 neo4j    neo4j         4096 Dec 11 23:46 conf
0 lrwxrwxrwx    1 root     root             5 May 11  2019 data -> /data
4 drwx------    1 neo4j    neo4j         4096 Feb 18  2019 import
8 drwx------    1 neo4j    neo4j         4096 May 11  2019 lib
0 lrwxrwxrwx    1 root     root             5 May 11  2019 logs -> /logs
4 drwx------    1 neo4j    neo4j         4096 Feb 18  2019 plugins
4 drwx------    1 neo4j    neo4j         4096 Feb 18  2019 run

我的问题是容器中的import目录是空的。但是datalogs目录并不是空的。

本地上的datalogs目录具有confplugins没有的扩展属性:

xattr -l data
com.docker.grpcfuse.ownership: {"UID":100,"GID":101}

我能识别的唯一区别是,那些目录中有docker-compose在获取Neo4j图像时创建的数据。

有人了解这里发生的事情吗?告诉我如何让它发挥作用?我使用的是Mac OS X 10.15和docker compose版本1.27.4,构建40524192。

谢谢。

TL;DR:您当前的设置可能运行良好。


浏览您观察到的特定行为:

  1. 在容器启动时,Docker将在主机上创建空目录(如果不存在(,并在容器内装入点目录。(这就是这些目录出现的原因。(

  2. Dockernever将数据从映像复制到绑定挂载中。这种行为只发生在命名卷上(并且只发生在您第一次使用它们时,而不是在以后的运行中;而且只发生在本机Docker上,而不是Kubernetes上(。

  3. 但是,标准数据库映像通常知道如何初始化空数据目录。在neo4j映像的情况下,其Dockerfile以在容器启动时运行的ENTRYPOINT指令结束;CCD_ 23知道如何进行各种首次设置。这就是数据进入./data的方式。

  4. 该图像还声明了一个WORKDIR /var/lib/neo4j(通过一个中间环境变量(。这就解释了,在ls -l列表中,为什么会有像data -> /data这样的符号链接。您的绑定装载是到/import,但如果您是docker-compose exec neo4j ls import,它看起来将相对于WORKDIR,这就是为什么目录看起来是空的。

  5. 但是,入口点脚本专门在容器中查找/import目录,如果该目录存在并且可读,则设置环境变量NEO4J_dbms_directories_import=/import

这一切都表明您的设置是正确的,如果您尝试执行导入,它将正常工作并查看主机数据。您正在查看映像中的/var/lib/neo4j/import目录,它是空的,但映像启动程序知道也要在容器中查找/import,并在那里查找装载点。

最新更新