从一个空目录开始,我创建了这个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
创建conf
、data
、logs
和plugins
目录。
data
和logs
是根据Neo4j图像的构建填充的,并且conf
和plugins
是空的,正如预期的那样。
我使用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
目录是空的。但是data
和logs
目录并不是空的。
本地上的data
和logs
目录具有conf
和plugins
没有的扩展属性:
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:您当前的设置可能运行良好。
浏览您观察到的特定行为:
-
在容器启动时,Docker将在主机上创建空目录(如果不存在(,并在容器内装入点目录。(这就是这些目录出现的原因。(
-
Dockernever将数据从映像复制到绑定挂载中。这种行为只发生在命名卷上(并且只发生在您第一次使用它们时,而不是在以后的运行中;而且只发生在本机Docker上,而不是Kubernetes上(。
-
但是,标准数据库映像通常知道如何初始化空数据目录。在
neo4j
映像的情况下,其Dockerfile以在容器启动时运行的ENTRYPOINT
指令结束;CCD_ 23知道如何进行各种首次设置。这就是数据进入./data
的方式。 -
该图像还声明了一个
WORKDIR /var/lib/neo4j
(通过一个中间环境变量(。这就解释了,在ls -l
列表中,为什么会有像data -> /data
这样的符号链接。您的绑定装载是到/import
,但如果您是docker-compose exec neo4j ls import
,它看起来将相对于WORKDIR
,这就是为什么目录看起来是空的。 -
但是,入口点脚本专门在容器中查找
/import
目录,如果该目录存在并且可读,则设置环境变量NEO4J_dbms_directories_import=/import
。
这一切都表明您的设置是正确的,如果您尝试执行导入,它将正常工作并查看主机数据。您正在查看映像中的/var/lib/neo4j/import
目录,它是空的,但映像启动程序知道也要在容器中查找/import
,并在那里查找装载点。