我试图了解如何在docker中正确添加非root用户并赋予他们sudo特权。假设我当前的Ubuntu 18.04系统具有janedoe作为sudo用户。我想创建一个docker镜像,在其中要将janedoe添加为可以在需要时具有sudo特权的非root用户。由于我是这个Linux系统以及Docker的新手,所以我通常会很高兴有人通过示例解释如何执行此操作。
我了解的是,每当我在Dockerfile中发出命令“USER janedoe”时,janedoe的特权都无法执行该行之后的许多命令。我假设我们在构建容器时必须像在管理员向系统中添加新用户时那样,将janedoe添加到sudo“组”中。
我一直在尝试寻找一些演示Dockerfile的示例来解释该示例,但是找不到它。
最佳答案
通常,您应该将Docker容器视为单个过程的包装器。如果您问这个关于其他过程的问题,那真的没有道理。 (如何将具有sudo特权的用户添加到PostgreSQL服务器?如何将用户添加到Web浏览器?)
在Docker中,您几乎不需要sudo
,这有以下三个原因:在大多数情况下切换用户很简单;您通常不会在容器中获得交互式shell(如何从cron守护程序内部获取目录列表?);如果您完全可以运行任何docker
命令,则可以很容易地将整个主机都root。 sudo
也很难编写脚本,并且很难在Docker中有效地维护用户密码(在可以轻松检索的纯文本文件中写入与根目录等效的密码不是安全性最佳实践)。
在问题的上下文中,如果您已经切换到某些非root用户,并且需要运行一些管理命令,请使用USER
切换回root。
USER janedoe
...
USER root
RUN apt-get update && apt-get install -y some-package
USER janedoe
由于您的容器与主机系统存在某种隔离,因此通常不需要容器具有与主机系统相同的用户名或用户ID。异常(exception)是使用绑定(bind)安装与主机共享文件时,但是最好在启动容器时指定此详细信息。我习惯的典型做法是这样的:
FROM ubuntu:18.04
RUN adduser --system --group --no-create-home appuser
RUN apt-get update && apt-get install ...
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
USER appuser
CMD ["./main.py"]
docker run -v
或Docker Compose volumes:
选项)。/etc/passwd
文件中。 docker run \
--name myapp \
-d \
-p 8000:8000 \
-v $PWD:/data \
-u $(id -u) \
myimage