如何在docker容器中使用sudo?

dru*_*ubb 223 sudo docker linux-containers

通常,使用用户root运行docker容器.我想使用不同的用户,使用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
Run Code Online (Sandbox Code Playgroud)

运行此容器,我使用用户'docker'登录.当我尝试使用sudo时,找不到该命令.所以我尝试使用在我的Dockerfile中安装sudo

RUN apt-get install sudo
Run Code Online (Sandbox Code Playgroud)

这导致无法找到包sudo

dru*_*ubb 216

刚刚得到它.Regan指出,我不得不将用户添加到sudoers组.但主要原因是我忘了更新存储库缓存,所以apt-get找不到sudo包.它现在正在运作.这是完成的代码:

FROM ubuntu:12.04

RUN apt-get update && \
      apt-get -y install sudo

RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo

USER docker
CMD /bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 在centos中不起作用.`adduser`命令吐出`useradd`的使用帮助 (8认同)
  • 这似乎不适用于 Ubuntu 18.04 docker 镜像 (3认同)
  • 对于 CentOS,您可以添加用户和组,然后在“/etc/sudoers.d/”下创建一个分片文件,并将该文件的权限设置为“440”。然后用户将在 CentOS、6 及更高版本下具有 sudo 访问权限。5 您必须在“/etc/sudoers”中添加“#includedir /etc/sudoers.d”指令 (2认同)

M. *_*ord 63

其他答案对我不起作用.我一直在搜索并找到一篇博客文章,其中介绍了团队如何在docker容器中运行非root用户.

这是TL; DR版本:

RUN apt-get update
RUN apt-get install sudo

RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER docker

# this is where I was running into problems with the other approaches
RUN sudo apt-get update 
Run Code Online (Sandbox Code Playgroud)

我正在使用FROM node:9.3这个,但我怀疑其他类似的容器基地也可以.

  • @WR 我认为您需要更改该行以读取“RUN sudo apt-get install -y tree”。将“USER”设置为除“root”以外的其他内容后,您需要对任何需要“root”权限的命令使用“sudo”。 (3认同)

Tom*_*ský 58

当容器中既没有sudo也没有apt-get时,您也可以使用命令以root用户身份跳转到正在运行的容器中

docker exec -u root -t -i container_id /bin/bash
Run Code Online (Sandbox Code Playgroud)

  • 对于OP可能想要实现的目标来说,这是一个更好的解决方案,即使接受的答案给出了所请求的解决方案。至少,这是我一直在寻找的答案! (6认同)
  • 有人给这个人一枚奖章 (3认同)
  • 这是最好的答案,而不是使用 dockerfile 来艰难地完成它。 (2认同)

小智 17

如果你想连接到容器并
使用apt-get
首先安装一些东西,如上面的回答我们的兄弟"TomášZáluský"

docker exec -u root -t -i container_id /bin/bash
Run Code Online (Sandbox Code Playgroud)

然后尝试

运行apt-get update或apt-get'你想要的任何东西'

它与我合作希望它对所有人都有用


Chr*_*ris 16

对于那些已经在运行的容器中遇到此问题,而又不必重建的人,以下命令将以root权限连接到正在运行的容器:

docker exec -ti -u root container_name bash
Run Code Online (Sandbox Code Playgroud)

您还可以通过以下方式找到它,使用其ID而不是其名称进行连接:

docker ps -l
Run Code Online (Sandbox Code Playgroud)

要保存您的更改,以使它们在您下次启动容器(或docker-compose集群)时仍然存在:

docker commit container_id image_name
Run Code Online (Sandbox Code Playgroud)

要启动未运行的容器并以root用户身份连接,请执行以下操作:

docker run -ti -u root --entrypoint=/bin/bash container_name -s
Run Code Online (Sandbox Code Playgroud)

要从正在运行的容器中复制:

docker cp <containerId>:/file/path/within/container /host/path/target
Run Code Online (Sandbox Code Playgroud)

导出图像的副本:

docker save container | gzip > /dir/file.tar.gz
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法还原到另一个Docker安装中:

gzcat /dir/file.tar.gz | docker load
Run Code Online (Sandbox Code Playgroud)

使用以下命令可以更快地进行压缩,但是占用更多空间来进行压缩:

docker save container | dir/file.tar
Run Code Online (Sandbox Code Playgroud)

和:

cat dir/file.tar | docker load
Run Code Online (Sandbox Code Playgroud)


Set*_*man 9

以下是我使用以下基本映像设置非 root 用户的方法ubuntu:18.04

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
Run Code Online (Sandbox Code Playgroud)

上面的代码会发生什么:

  • 用户和组foo已创建。
  • 用户foo被添加到 thefoosudogroup。
  • uidgid被设置为值999
  • 主目录设置为/home/foo.
  • 外壳设置为/bin/bash.
  • sed命令会在线更新的/etc/sudoers文件,以允许fooroot用户密码的来访问sudo组。
  • sed命令禁用#includedir允许子目录中的任何文件覆盖这些内联更新的指令。


Yog*_*cha 9

如果在容器内无法访问SUDOapt-get,您可以在运行容器中使用下面的选项。

docker exec -u root -it f83b5c5bf413 ash
Run Code Online (Sandbox Code Playgroud)

f83b5c5bf413”是我的容器 ID,这里是我终端的工作示例:

在此处输入图片说明


Ale*_*ski 7

这可能不适用于所有映像,但某些映像已包含 root 用户,例如在 jupyterhub/singleuser 映像中。有了这张图片,就很简单了:

USER root
RUN sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

  • 对于图像“fabric8/java-centos-openjdk8-jdk”,只需在 RUN 命令之前添加 USER root 即可解决我的问题,甚至不需要添加 sudo (2认同)

Cha*_*ker 7

主要思想是,您需要根据容器创建一个root用户的用户。

主要命令:

RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo
Run Code Online (Sandbox Code Playgroud)

第一个发送文字字符串,bot:botchpasswd密码创建用户机器人bot,chpasswd 的作用是:

The chpasswd command reads a list of user name and password pairs from standard input and uses this information to update a group of existing users. Each line is of the format:

user_name:password

By default the supplied password must be in clear-text, and is encrypted by chpasswd. Also the password age will be updated, if present.
Run Code Online (Sandbox Code Playgroud)

我假设的第二个命令将用户机器人添加为 sudo。

完整的 docker 容器可供使用:

FROM continuumio/miniconda3
# FROM --platform=linux/amd64 continuumio/miniconda3

MAINTAINER Brando Miranda "me@gmail.com"

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    ssh \
    git \
    m4 \
    libgmp-dev \
    opam \
    wget \
    ca-certificates \
    rsync \
    strace \
    gcc \
    rlwrap \
    sudo

# https://github.com/giampaolo/psutil/pull/2103

RUN useradd -m bot
# format for chpasswd user_name:password
RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo

WORKDIR /home/bot
USER bot
#CMD /bin/bash
Run Code Online (Sandbox Code Playgroud)


林果皞*_*林果皞 6

接受的答案不同,我usermod改为使用。

假设已经在 docker 中以 root 身份登录,并且“fruit”是我要添加的新的非 root 用户名,只需运行以下命令:

apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit
Run Code Online (Sandbox Code Playgroud)

更新后记得保存图片。使用docker ps获得当前正在运行的码头工人的<容器ID>和<IMAGE>,然后运行docker commit -m "added sudo user" <CONTAINER ID> <IMAGE>以节省码头工人的形象。

然后测试:

su fruit
sudo whoami
Run Code Online (Sandbox Code Playgroud)

或者在启动 docker 时以非 root 用户身份直接登录(确保先保存图像)进行测试:

docker run -it --user fruit <IMAGE>
sudo whoami
Run Code Online (Sandbox Code Playgroud)

您可以使用sudo -k重置密码提示时间戳:

sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password
Run Code Online (Sandbox Code Playgroud)