知识库

以非根用户运行 Docker

运行 Neo4j Docker 时,它将在容器内以 neo4j 用户身份运行。但是,要以不同的用户身份运行 Docker,可以指定 --user 参数。文档中有一节介绍如何以非根用户身份运行

但希望在这篇知识库文章中对此进行详细说明。

使用 --user 标志时,需要提供一个有效的非根用户值。我们的 Docker 容器假定/要求用户 a) 不是 root b) 对数据和日志目录具有写入权限,并对配置目录具有读取权限。请注意,如果您将 0:0 或 0 或 root 等作为 --user 传递,它仍然不会使用 root 运行 neo4j,但容器将使用其自己的内部 neo4j 用户和 neo4j 用户组(它们恰好目前具有 uid 101 和 gid 101,但不要依赖于此)。Docker 入口点专门编写为避免以 root 身份运行 neo4j docker 镜像。

因此,这里最好的方法是创建一个用户和组,并将它们传递到 Docker 输入 --user。

创建一个没有主目录的 neo4j 用户

$ sudo useradd -M neo4j

阻止 neo4j 登录

$ sudo usermod -L neo4j

创建数据目录。

$ 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 以外的任何应用程序写入数据目录。这可能会损坏数据存储。

$ 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
如果您对配置目录进行了外部更改,则必须重新启动 docker 镜像才能获取新的配置(配置在启动时从已挂载的卷中复制)。
$ 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

假设日志目录由多个应用程序使用。请注意,如果某些内容干扰了 neo4j 写入日志,则可能会使 neo4j 进程崩溃。为所有与日志相关的事项创建一个日志组

$ sudo groupadd logs

将 neo4j 添加到日志组

$ 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