docker - 在 Docker 中添加具有 sudo 权限的用户的干净方法是什么?

标签 docker dockerfile

我试图了解如何在 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。异常(exception)情况是使用绑定(bind)挂载与主机共享文件时,但最好在启动容器时指定此详细信息。
我习惯的典型做法是这样的:
  • 在您的 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 Compose volumes: 选项)。
  • 如果文件权限真的很重要,您可以指定启动容器时要使用的数字主机用户 ID。用户不需要特别存在于容器的 /etc/passwd 文件中。
     docker run \
       --name myapp \
       -d \
       -p 8000:8000 \
       -v $PWD:/data \
       -u $(id -u) \
       myimage
    
  • 关于docker - 在 Docker 中添加具有 sudo 权限的用户的干净方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62988075/

    相关文章:

    php - 基于ZMQContext的$ socket-> send()之后,php进程永不消亡,如何解决?

    java - Spring Boot 应用程序通过 HTTPS 调用另一个 Spring Boot 应用程序并获取 SSL 证书验证错误 : "signature check failed"

    linux - 自定义 docker 位置导致 SELinux 标签未标记

    node.js - Docker NodeJS Puppeteer@2.0.0-如何修复无法启动Chrome!问题

    linux - Dockerfile CMD `command not found`

    bash - 简单的 docker 部署策略

    java - 在 Web 浏览器中无法看到 Java Maven Tomcat-plugin Web 应用程序

    php - Docker 容器上的 Couchbase PHP SDK 2.6

    docker - 如何将Docker镜像映射到Dockerfile?

    docker - 还有与Livy服务器(livy.conf)一起完成的其他配置吗?