CS1*_*101 14 docker dockerfile
我试图了解如何在 docker 中正确添加非 root 用户并赋予他们 sudo 权限。假设我当前的 Ubuntu 18.04 系统有 janedoe 作为 sudo 用户。我想创建一个 docker 映像,在其中添加 janedoe 作为非 root 用户,在需要时可以拥有 sudo 权限。由于我对这个 Linux 系统和 Docker 都是新手,所以我通常希望有人通过示例解释如何做到这一点。
据我了解,每当我在 Dockerfile 中发出命令“USER janedoe”时,该行之后的许多命令都无法通过 janedoe 的权限执行。我假设我们在构建容器时必须将 janedoe 添加到 sudo“组”中,就像管理员向系统添加新用户时所做的那样。
我一直在尝试寻找一些解释该示例的演示 Dockerfile,但找不到。
Dav*_*aze 17
一般来说,您应该将 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
Run Code Online (Sandbox Code Playgroud)
由于容器与主机系统有一定的隔离,因此通常不需要容器具有与主机系统相同的用户名或用户 ID。例外情况是使用绑定挂载与主机共享文件时,但最好在启动容器时指定此详细信息。
我习惯的典型做法是这样的:
在您的 Dockerfile 中,创建一些非 root 用户。它可以有任何名称。它不需要密码、登录 shell、主目录或任何其他详细信息。将其视为“系统”用户就可以了。
FROM ubuntu:18.04
RUN adduser --system --group --no-create-home appuser
Run Code Online (Sandbox Code Playgroud)
仍然在您的 Dockerfile 中,以 root 身份执行几乎所有操作。这包括安装您的应用程序。
RUN apt-get update && apt-get install ...
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
Run Code Online (Sandbox Code Playgroud)
当您描述了运行容器的默认方式时,才切换到非 root 用户。
EXPOSE 8000
USER appuser
CMD ["./main.py"]
Run Code Online (Sandbox Code Playgroud)
理想情况下,故事就这样结束了:您的代码内置于您的映像中,并将其所有数据存储在外部(例如数据库)中,因此它根本不关心主机用户空间(默认情况下不应该docker run -v
或Docker Composevolumes:
选项)。
如果文件权限确实很重要,您可以指定启动容器时要使用的数字主机用户 ID。用户并不特别需要存在于容器的/etc/passwd
文件中。
docker run \
--name myapp \
-d \
-p 8000:8000 \
-v $PWD:/data \
-u $(id -u) \
myimage
Run Code Online (Sandbox Code Playgroud)
我认为您正在寻找这个问题的答案: 如何将用户添加到 docker 容器
RUN useradd -ms /bin/bash janedoe <-- this command adds the user
usermod -aG sudo janedoe <-- this command tells the container to put the user janedoe inside the SUDO group
Run Code Online (Sandbox Code Playgroud)
然后,如果您想切换到该用户来执行脚本的其余部分,请使用:
USER janedoe <-- all lines after this now use the janedoe user to execute them
WORKDIR /home/janedoe <-- this tells your script from this line on to use paths relative to janedoe's home folder
Run Code Online (Sandbox Code Playgroud)
由于容器本身运行 Linux 模块,因此大多数(如果不是全部)Linux 命令也应该在容器内运行。如果您有静态用户(即可以预测哪些用户),您应该能够在用于创建映像的 Dockerfile 中创建它们。现在,每次从所述映像运行容器时,您都应该在其中获取 janedoe 用户。
归档时间: |
|
查看次数: |
33994 次 |
最近记录: |