以非 root 用户身份运行 Docker
在运行 Neo4j Docker 时,容器内部会以 neo4j 用户运行。但如果想以其他用户运行 Docker,可以通过 --user 参数指定。文档中有关于以非根用户运行的章节。
但我们想在本知识库文章中进一步阐述此内容。
使用 --user 标志时必须提供一个有效的、非根用户值。我们的 Docker 容器假设/要求用户满足以下条件:a) 不是 root;b) 对 data 和 logs 目录拥有写权限,并对 conf 目录拥有读取权限。需要注意的是,如果你传入 0:0、0 或 root 等作为 --user,容器仍不会以 root 运行 Neo4j,而是使用其内部的 neo4j 用户和 neo4j 用户组(当前 UID 为 101、GID 为 101,但不应依赖此数值)。Docker 的入口点专门编写为避免以 root 运行 Neo4j 镜像。
因此,最佳做法是创建一个用户和用户组,并将其通过 --user 参数传递给 Docker。
创建一个没有主目录的 neo4j 用户
$ sudo useradd -M neo4j
阻止 neo4j 登录
$ sudo usermod -L neo4j
创建 data 目录。
$ sudo mkdir -p /neo4j/data
$ sudo chown -R neo4j /neo4j/data
$ sudo chgrp -R neo4j /neo4j/data
注意此处仅给予组读取权限
$ sudo chmod -R u+rwX,g+rX,o-wrx /neo4j/data
我们不建议除 neo4j 之外的任何应用写入 data 目录,这可能会损坏数据存储。
$ sudo mkdir -p /neo4j/conf
$ sudo chown -R neo4j /neo4j/conf
$ sudo chgrp -R neo4j /neo4j/conf
在这里为组授予写入权限
$ sudo chmod -R u+rX,g+rwX,o-wrx /neo4j/conf
| 如果对 conf 目录做了外部修改,必须重新启动 Docker 镜像以加载新配置(conf 在启动时会从挂载卷复制)。 |
$ sudo mkdir -p /neo4j/plugins
$ sudo chown -R neo4j /neo4j/plugins
$ sudo chgrp -R neo4j /neo4j/plugins
在这里为组授予写入权限
$ sudo chmod -R u+rwX,g+rwX,o-wrx /neo4j/plugins # N.b. if you make external changes to the plugins dir you must restart neo4j before it will pickup new plugins
假设 logs 目录被多个应用共同使用。提醒:如果有什么干扰了 neo4j 写入日志,可能导致 neo4j 进程崩溃。为所有日志相关的内容创建一个 logs 组。
$ sudo groupadd logs
将 neo4j 加入 logs 组
$ sudo usermod -a -G logs neo4j
$ sudo mkdir -p /logs/neo4j
$ sudo chown -R root /logs/neo4j
$ sudo chgrp -R logs /logs/neo4j
$ sudo chmod -R u+rwX,g+rwX,o-wrx /logs/neo4j
如果 Docker 并非以 root 运行
$ docker_user=root
$ sudo usermod -a -G logs "${docker_user}"
$ sudo usermod -a -G neo4j "${docker_user}"
将自己添加到 neo4j 组,这样上面创建的 /neo4j/* 目录才能被读取和编辑。
$ current_user=$(id -un)
$ sudo usermod -a -G neo4j "${current_user}"
启动一个新 shell 以便获取该组的赋权。
注意 Docker 并不会自动加载次要组,需要显式地进行此操作。
$ groups=( $( id --real --groups neo4j ) )
$ docker run \
--publish=7474:7474 --publish=7687:7687 \
--volume=/neo4j/data:/data \
--volume=/neo4j/plugins:/plugins \
--volume=/neo4j/conf:/conf \
--volume=/logs/neo4j:/logs \
--user="$(id -u neo4j):$(id -g neo4j)" \
--group-add=$groups \
neo4j:3.4
此页面有帮助吗?