【问题标题】:How do I run docker container as exact user on host?如何在主机上以确切用户身份运行 docker 容器?
【发布时间】:2019-04-26 09:23:07
【问题描述】:

在我的主机上,我有用户“appuser”,在我的 dockerfile 中,我创建了用户“appuser”。

1) 假设我的程序从 /tmp/a/ 接收一个文件,并将一个新文件输出到 /tmp/b/,这些文件作为卷从主机传递到容器。 2) 作为主机上的 appuser,我创建 /tmp/a/test.txt,但输出的文件由于某种原因具有权限“polkitd:libstoragemgmt”而不是“appuser:appuser”。

如何确保输出的文件具有“appuser”权限(同一用户在容器内运行程序)?

【问题讨论】:

    标签: docker docker-volume volumes


    【解决方案1】:

    容器内的用户在宿主机上不存在,两个环境之间共享的是UID/GID。因此,在容器内部,UID 可能会映射到 appuser,而在您的主机上,相同的 UID 可能会映射到 polkitd。如果您查看主机和容器上的 /etc/passwd 文件,您会发现它们可能不匹配。这仅在您使用主机挂载时才真正可见,因为文件所有者在主机上的该场景中可见。

    您可以尝试的一个解决方案是将 /etc/passwd 和 /etc/group 从主机安装到容器,以便您在每一侧拥有相同的用户和组,但这有可能构建映像的缺点使用主机上不存在的用户,或者如果确实存在,它可能具有不同的 UID/GID 值,从而使文件系统上的文件归错误的用户所有。

    我个人的解决方案是使用我在入口点内运行的脚本调整容器内的 UID/GID 以匹配主机上的用户。它将作为卷挂载的文件或目录的所有者与容器内用户的所有者进行比较,当它们不匹配时,容器用户将被修改。为此,您需要以 root 身份启动容器,但您可以在入口点的末尾从 root 删除到您的 appuser 以运行容器命令(我通常为此使用 exec + gosu)。您可以在我的基本映像存储库https://github.com/sudo-bmitch/docker-base 中找到一个用于此的脚本 fix-perms 以及一个示例。

    【讨论】:

    • 例如 mariadb Dockerfile 镜像,默认设置为 root,即使它创建了 mysql 用户,我通过在末尾添加 User mysql 标签来扩展 Dockerfile。现在完美这个容器以非root用户身份运行,但是mysql用户uid is 999 ,我的是1000 ,我应该将mysql用户修改为1000吗?我对此有很大的麻烦。
    • @jcarlosweb 看看 fix-perms 脚本。仅更改 /etc/passwd 中的 uid 通常是不够的,因为映像中的文件通常以旧 uid 存在,因此您还需要调整文件所有权。作为容器启动的一部分,我倾向于即时执行此操作,因为今天你的 uid 是 1000,但明天你的同事是 1001。
    • 我明白,但是如果例如在那个容器中我不需要主机访问权限,即我不打算绑定挂载,只是一个名称卷,我真的可以使用生成的 uid通过容器?
    • @jcarlosweb 这里的问题是关于主机卷的。如果您没有主机卷,那么听起来您有不同的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多