知识库

以非 Root 用户运行 Docker

当运行 Neo4j Docker 时,它将在容器内部以 neo4j 用户身份运行。但是,要以不同用户身份运行 docker,可以指定 --user 参数。文档中有一个关于以非 root 用户运行的部分

但想在这篇知识库文章中进一步阐述。

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

所以这里的最佳方法是创建一个用户和组,并将其传递给 Docker 输入 --user。

创建一个没有主目录的用户 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 以外的任何应用程序写入数据目录。这可能会损坏数据存储。

$ 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

假设日志目录被多个应用程序使用,请注意,如果有什么干扰了 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
© . All rights reserved.