在Docker容器中如何使用sudo?

493

通常情况下,Docker 容器是以用户 root 来运行的。我想使用一个不同的用户,这是通过 Docker 的 USER 指令很容易实现的。但是这个用户应该能够在容器内部使用 sudo 命令,而这个命令却没有安装。

以下是一个专为此目的设计的简单 Dockerfile:

FROM ubuntu:12.04

RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker

USER docker
CMD /bin/bash

运行此容器,我通过"docker"用户登录。当我尝试使用sudo时,命令未找到。因此,我尝试在Dockerfile中安装sudo软件包。


RUN apt-get install sudo

这会导致出现无法定位sudo软件包的错误。


1
只需将sudo组授予用户即可。http://askubuntu.com/questions/7477/how-can-i-add-a-new-user-as-sudoer-using-the-command-line - Regan
14个回答

2
如果您有一个以root身份运行的容器,运行一个脚本(您无法更改),需要访问sudo命令,则可以在$PATH中创建一个新的sudo脚本,调用传递的命令即可。
例如,在您的Dockerfile文件中:
RUN if type sudo 2>/dev/null; then \ 
     echo "The sudo command already exists... Skipping."; \
    else \
     echo -e "#!/bin/sh\n\${@}" > /usr/sbin/sudo; \
     chmod +x /usr/sbin/sudo; \
    fi

1
根据您使用的Docker镜像(在我这里是Ubuntu:18.04),您可能需要从echo中删除-e。否则,它会出现在文件本身中,使其无法正常工作。 - stiller_leser
好主意,但如果原始命令使用sudo选项(例如sudo -E ls),则此方法将无法正常工作。它会尝试执行-E ls - wisbucky

2
一个适用于Centos7的Dockerfile示例。在这个示例中,我们添加了一个名为prod_user的用户,并赋予其sudo权限。
FROM centos:7

RUN yum -y update && yum clean all

RUN yum -y install openssh-server  python3 sudo

RUN adduser -m prod_user && \
    echo "MyPass*49?" | passwd prod_user --stdin && \
    usermod -aG wheel prod_user && \
    mkdir /home/prod_user/.ssh && \
    chown prod_user:prod_user -R  /home/prod_user/ && \
    chmod 700 /home/prod_user/.ssh

RUN echo "prod_user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "%wheel ALL=(ALL) ALL" >> /etc/sudoers

RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config

RUN systemctl enable sshd.service

VOLUME [ "/sys/fs/cgroup" ]

ENTRYPOINT ["/usr/sbin/init"]

0

我正在使用Ubuntu镜像,使用Docker桌面时遇到了这个问题。

以下解决了这个问题:

  1. apt-get update
  2. apt-get install sudo

0

关于如何在CentOS上执行此操作,目前还没有答案。 在CentOS上,您可以将以下内容添加到Dockerfile中

RUN echo "user ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/user && \
    chmod 0440 /etc/sudoers.d/user

但是这个命令仍然失败了:Step 6/8 : RUN echo "user ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/user && chmod 0440 /etc/sudoers.d/user ---> Running in daea0aae031c /bin/sh: 1: cannot create /etc/sudoers.d/user: Permission denied - xnervwang
这实际上使得你的“非root”用户等同于root,只要攻击者知道在他们的命令前加上sudo。虽然比以root身份运行略好,但我通常不建议在Docker设置中使用。 - David Maze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接