Docker用户

我们的技术总监Andrey Kopylov喜欢,积极使用和推广Docker。 在一篇新文章中,他讨论了如何在Docker中创建用户。 正确使用它们,为什么不能为用户授予root特权,以及如何解决Dockerfile中标识符不匹配的问题。


除非以特殊方式指定,否则容器中的所有进程都将以root身份运行。 似乎非常方便,因为该用户没有任何限制。 从安全的角度来看,这就是为什么在根源下工作是错误的。 如果在本地计算机上没有人凭自己的权限使用根权限,则许多启动进程都在容器根目录下。


总是存在一些漏洞,这些漏洞使恶意软件能够从容器中逃脱并进入主机。 假设情况最糟,我们必须确保从对主机没有任何权限的用户启动容器内的进程。


用户创建


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


对于Dockerfile中基于debian的发行版,您必须添加:



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 

如果您使用基本的高山图像,则需要安装影子软件包:


 RUN apk add —no-cache shadow 

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


如果您的标识符和所有从事该项目的人员的标识符相同,则只需在Dockerfile中指定此标识符。 但是,用户标识符通常不匹配。


如何立即实现期望尚不清楚。 对我来说,这是掌握Docker过程中最困难的事情。 许多Docker用户并不认为映像的生命存在不同的阶段。 首先,使用Dockerfile为此收集图像。 从Dockerfile映像启动容器时,不再使用它。


创建映像时应创建用户。 这同样适用于从中启动进程的用户定义。 这意味着我们必须以某种方式将UID(GID)传递到容器中。


ENVARG指令用于在Dockerfile中使用外部变量。 指令的详细比较在这里


Docker文件


 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的所有技巧,仅阅读文档或文章还不够。 您需要练习很多,您需要感受码头工人。

Source: https://habr.com/ru/post/zh-CN448480/


All Articles