从现有 Dockerfile 派生 + 将 USER 设置为非 root

奥利弗

我试图找到一个通用的最佳实践如何:

  1. 取一个任意(父)Dockerfile,例如以 root 身份运行其容器化服务的官方 Docker 镜像之一,
  2. 从中派生一个自定义(子)Dockerfile(通过FROM ...),
  3. 调整进程,使其与进程运行相同的服务,但以非 root 用户身份运行

我已经搜索并尝试了好几天,但一直无法提出令人满意的解决方案。

我想提出一种方法,例如类似于以下内容,仅用于调整原始服务运行的用户:

FROM mariadb:10.3

RUN chgrp -R 0 /var/lib/mysql && \
    chmod g=u /var/lib/mysql

USER 1234

但是,我一次又一次遇到的问题是,每当Dockerfile 将某个路径声明为VOLUME(在上面的示例中实际上是VOLUME /var/lib/mysql)时,这实际上使Dockerfile 无法调整该特定路径的文件权限。chgrpchmod是没有在这种情况下的效果,所以造成泊坞窗容器将无法成功启动,由于文件访问权限问题。

我知道VOLUME指令的设计方式以及为什么会这样,但在我看来,它似乎完全阻止了给定问题的简单解决方案:采用 Dockerfile 并以简单、干净和简约的方式调整它以运行作为非根而不是根。

背景是:我正在尝试在 Openshift 集群上运行任意 Docker 镜像。默认情况下,Openshift 会阻止以 root 身份运行容器,我想保持这种方式,因为它看起来很理智,并且在安全方面朝着正确的方向迈出了一步。

这意味着像 那样的解决方案gosu,期望容器以 root 身份启动以便在运行时删除特权在这里是不够的。我想要一种方法,它根本不需要容器以 root 身份启动,而只需要指定的USER甚至是随机的 UID。

到目前为止,我发现的令人不满意的方法是:

  • 复制Dockerfile 并以必要的方式对其进行调整(有效复制代码)
  • sed/awk在构建期间通过所有服务的配置文件将原始VOLUME路径替换为备用路径,以便chgrpchmod可以工作(保留原始VOLUME路径孤立)。

我真的不喜欢这些方法,因为它们需要真正深入研究Dockerfile的逻辑和基础架构以及服务本身的运行方式。

所以一定有更好的方法来做到这一点,对吧?我错过了什么?非常感谢帮助。

代码护林员

卷挂载点的权限根本无关紧要,挂载覆盖了所有底层权限。此外,您可以在 Kubernetes 级别设置此类内容,而根本不必担心 Dockerfile。这通常是一个 PodSecurityPolicy,但您也可以在 pod 本身的 SecurityContext 中设置它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将元素插入从现有内容派生的XML文档中

将 Gitlab 中的变量设置为 Dockerfile

将 git repo 克隆到 Dockerfile 中的非 root 用户文件夹

从现有基础对象(非派生)创建一个新的派生对象

将新状态设置为现有数组状态

将Django的FileField设置为现有文件

Javascript:将ID设置为现有子表

如何将现有的LiveConnectSession设置为LiveConnectClient?

PostgreSQL 无法将现有列设置为 IDENTITY

为什么不建议将root用户的默认shell设置为非POSIX shell?

将列中的所有非NA设置为1

Netbeans 将 root 设置为作者

Nginx 仅在将工作进程用户设置为 root 时才有效

Dockerfile:将npm添加到现有的Docker映像

如何将postgresql添加到现有的dockerfile中?

我可以将现有的Docker容器导出到Dockerfile中吗?

将项目目录设置为 Dockerfile 中 Entrypoint 的 Workdir

Dockerfile如何将文件名设置为env

是否可以将dtype设置为现有的结构化数组,或为现有数组添加“列名”?

如何将Dart IO流程设置为将现有Stream用于其stdin?

如何将现有Pandas DataFrame的所有值设置为零?

将现有数组的所有值设置为“幻数”

Magento:将“ container1”设置为所有现有产品

如何创建为现有 jenkins 容器安装 dotnet sdk 的 Dockerfile

将内部硬盘驱动器分区的所有者从root更改为user

kubernetes PodSecurityPolicy设置为runAsNonRoot,容器具有runAsNonRoot,并且映像具有非数字用户(appuser),无法验证用户是否为非root用户

root 拥有的 Docker 卷目录(不使用 Dockerfile)

(如何)可以将tmpfs创建为普通(非root)用户?

将新 List 对象中的值设置为现有 List 中的值