Docker 中的用户

安德烈·科佩洛夫我们的 CTO 热爱、积极使用和推广 Docker。 在一篇新文章中,他解释了如何在 Docker 中创建用户。 与他们正确合作,为什么用户不应该保留 root 权限以及如何解决 Dockerfile 中指标不匹配的问题。

容器中的所有进程都将以 root 用户身份运行,除非您以特殊方式指定。 这看起来很方便,因为这个用户没有任何限制。 这就是为什么从安全角度来看以 root 身份工作是错误的。 如果没有一个头脑清醒的人在具有 root 权限的本地计算机上工作,那么许多人会在容器中以 root 身份运行进程。

总是存在允许恶意软件从容器中逃逸并进入主机的错误。 假设最坏的情况,我们必须确保容器内的进程由在主机上没有任何权限的用户运行。

创建用户

在容器中创建用户与在 Linux 发行版中创建用户没有什么不同。 但是,对于不同的基础映像,命令可能会有所不同。

对于基于 debian 的发行版,您需要将以下内容添加到 Dockerfile 中:

RUN groupadd --gid 2000 node 
  && useradd --uid 2000 --gid node --shell /bin/bash --create-home node

对于高山:

RUN addgroup -g 2000 node 
    && adduser -u 2000 -G node -s /bin/sh -D node

从用户运行进程

要以 UID 2000 的用户身份运行所有后续进程,请运行:

USER 2000

要以节点用户身份运行所有后续进程,请运行:

USER node

阅读更多内容 文件资料.

安装卷

在容器内安装卷时,为用户提供读取和/或写入文件的能力。 为此,容器内用户的 UID (GID) 和容器外具有访问该文件的适当权限的用户必须匹配。 在这种情况下,用户名并不重要。

通常在 Linux 计算机上,用户的 UID 和 GID 等于 1000。这些标识符被分配给计算机的第一个用户。

找出您的标识符很容易:

id

您将收到有关您的用户的全面信息。
将示例中的 2000 替换为您的标识符,一切都会好起来的。

为用户分配 UID 和 GID

如果之前创建了用户,但需要更改标识符,可以这样做:

RUN usermod -u 1000 node 
  && groupmod -g 1000 node

如果使用alpine基础镜像,则需要安装shadow包:

RUN apk add —no-cache shadow

构建镜像时在容器内传递用户ID

如果您的标识符与参与该项目的所有人员的标识符匹配,那么在 Dockerfile 中指示该标识符就足够了。 然而,用户 ID 通常不匹配。

如何实现您想要的目标尚不清楚。 对于我来说,这是掌握 Docker 过程中最困难的事情。 许多 Docker 用户没有意识到镜像的生命周期有不同的阶段。 首先,使用 Dockerfile 组装映像。 从映像运行容器时,不再使用 Dockerfile。

用户创建必须在构建镜像时进行。 这同样适用于确定启动进程的用户。 这意味着我们必须以某种方式在容器内传递 UID (GID)。

指令用于在 Dockerfile 中使用外部变量 ENV и ARG。 指令详细比较 这里.

Dockerfile

ARG UID=1000
ARG GID=1000
ENV UID=${UID}
ENV GID=${GID}
RUN usermod -u $UID node 
  && groupmod -g $GID node

您可以通过 docker-compose 传递参数,如下所示:

泊坞窗,撰写

build:
  context: ./src/backend
  args:
    UID: 1000
    GID: 1000

PS 要掌握 Docker 的所有复杂之处,仅仅阅读文档或文章是不够的。 你需要大量练习,你需要对 Docker 有一定的感觉。

来源: habr.com

添加评论