docker - 在 Docker 中添加具有 sudo 权限的用户的干净方法是什么?
问题描述
我试图了解如何在 docker 中正确添加非 root 用户并赋予他们 sudo 权限。假设我当前的 Ubuntu 18.04 系统有 janedoe 作为 sudo 用户。我想创建一个 docker 映像,我想将 janedoe 添加为非 root 用户,该用户可以在需要时拥有 sudo 权限。由于我是这个 Linux 系统以及 Docker 的新手,因此我通常希望有人通过示例解释如何执行此操作。
我理解的是,每当我在 Dockerfile 中发出命令“USER janedoe”时,该行之后的许多命令都无法通过 janedoe 的权限执行。我假设在构建容器时我们必须将 janedoe 添加到 sudo“组”,类似于我们在管理员向系统添加新用户时所做的事情。
我一直在尝试寻找一些演示 Dockerfile 来解释该示例,但找不到它。
解决方案
通常,您应该将 Docker 容器视为单个进程的包装器。如果你问这个关于其他进程的问题,那真的没有意义。(如何使用 sudo 权限将用户添加到我的 PostgreSQL 服务器?如何将用户添加到我的 Web 浏览器?)
在 Docker 中,您几乎不需要sudo
,原因有三个: 在大多数情况下切换用户很简单;您通常不会在容器中获得交互式 shell(如何从 cron 守护进程中获取目录列表?);如果你可以运行任何docker
命令,你可以很容易地 root 整个主机。 sudo
也很难编写脚本,并且很难在 Docker 中有效地维护用户密码(在可以轻松检索的纯文本文件中编写与 root 等效的密码不是安全最佳实践)。
在您的问题的上下文中,如果您已经切换到某个非 root 用户,并且您需要运行一些管理命令,请使用USER
切换回 root。
USER janedoe
...
USER root
RUN apt-get update && apt-get install -y some-package
USER janedoe
由于您的容器与主机系统有一些隔离,因此您通常不需要容器具有与主机系统相同的用户名或用户 ID。例外情况是使用绑定挂载与主机共享文件时,但最好在启动容器时指定此详细信息。
我习惯的典型做法是这样的:
在您的 Dockerfile 中,创建一些非 root 用户。它可以有任何名称。它不需要密码、登录 shell、主目录或任何其他详细信息。将其视为“系统”用户很好。
FROM ubuntu:18.04 RUN adduser --system --group --no-create-home appuser
仍然在您的 Dockerfile 中,以 root 身份执行几乎所有操作。这包括安装您的应用程序。
RUN apt-get update && apt-get install ... WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . .
当你描述了运行容器的默认方式时,才切换到非root用户。
EXPOSE 8000 USER appuser CMD ["./main.py"]
理想情况下,这就是故事的结尾:您的代码内置在您的图像中,并将其所有数据存储在数据库等外部某个位置,因此它根本不关心主机用户空间(默认情况下不应该
docker run -v
或Docker Composevolumes:
选项)。如果文件权限真的很重要,您可以指定启动容器时要使用的数字主机用户 ID。用户不需要特别存在于容器的
/etc/passwd
文件中。docker run \ --name myapp \ -d \ -p 8000:8000 \ -v $PWD:/data \ -u $(id -u) \ myimage
推荐阅读
- vue.js - 开玩笑测试正在从 Vue watcher 调用函数
- python - r 请求。从多个 url 下载数据
- algorithm - 如何制作涂抹工具算法?
- java - 如何用spring boot创建关联类?
- java - 将 ISO3 国家代码转换为整个国家名称,Android
- html - Bootstrap Vue 导航栏无法填满屏幕
- mapi - 使用 Outlook Redemption 的全局地址列表
- node.js - 将图片上传到 S3 时访问被拒绝
- node.js - 如何在 NodeJS 中使用 fluent-ffmpeg 将图像转换为视频
- r - 将四个数据框列折叠成两个交错列