如何在docker容器中使用sudo?

如何在docker容器中使用sudo?,docker,sudo,linux-containers,Docker,Sudo,Linux Containers,通常,docker容器使用用户根运行。我想使用不同的用户,使用docker的用户指令没有问题。但是该用户应该能够在容器内使用sudo。缺少此命令 以下是一个用于此目的的简单Dockerfile: FROM ubuntu:12.04 RUN useradd docker && echo "docker:docker" | chpasswd RUN mkdir -p /home/docker && chown -R docker:docker /home/docke

通常,docker容器使用用户根运行。我想使用不同的用户,使用docker的用户指令没有问题。但是该用户应该能够在容器内使用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中使用

RUN apt-get install sudo

这导致无法定位软件包sudo

刚刚获得它。正如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

其他的答案对我不起作用。我一直在搜索,发现了一个关于团队如何在docker容器中运行非root的文档

这是TL;DR版本:

RUN apt-get update \
 && apt-get install -y 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 

为此,我使用了节点9.3中的
,但我怀疑其他类似的容器基础也可以使用。

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

docker exec -u root -t -i container_id /bin/bash

如果要连接到容器并安装某些内容
使用apt-get
首先是我们的兄弟“TomášZáluský”的上述回答

然后试着

运行apt get update或apt get“任何您想要的”

它对我起作用了
希望它对所有人都有用如果您有一个以root用户身份运行的容器,该容器运行的脚本(您不能更改)需要访问
sudo
命令,那么您只需在
$PATH
中创建一个新的
sudo
脚本即可调用传递的命令

e、 g.在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

对于已经运行的容器存在此问题且不一定要重建的任何人,以下命令将以root权限连接到正在运行的容器:

docker exec -ti -u root container_name bash
您还可以使用其ID(而不是名称)进行连接,方法是通过以下方式查找:

docker ps -l
要保存更改,以便下次启动容器(或docker compose群集)时仍保留更改,请执行以下操作:

要回滚到以前的图像版本(警告:这将删除历史记录而不是附加到末尾,因此要保留对当前图像的引用,请首先使用可选步骤对其进行标记):

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

docker run -ti -u root --entrypoint=/bin/bash image_id_or_name -s
要从正在运行的容器复制,请执行以下操作:

docker cp <containerId>:/file/path/within/container /host/path/target
您可以使用以下方法将其还原到另一个Docker安装:

gzcat /dir/file.tar.gz | docker load
它速度更快,但不压缩需要更多空间,使用:

docker save container | dir/file.tar
以及:


下面是我如何使用ubuntu:18.04的基本映像设置非root用户:

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
上述代码会发生什么情况:

  • 创建用户和组
    foo
  • 用户
    foo
    被添加到
    foo
    sudo
  • uid
    gid
    的值设置为
    999
  • 主目录设置为
    /home/foo
  • shell被设置为
    /bin/bash
  • sed
    命令对
    /etc/sudoers
    文件进行内联更新,以允许
    foo
    root
    用户无密码访问
    sudo
  • sed
    命令禁用
    #includedir
    指令,该指令允许子目录中的任何文件覆盖这些内联更新
这可能不适用于所有映像,但某些映像已经包含根用户,例如在jupyterhub/singleuser映像中。有了这个图像,它就简单地说:

USER root
RUN sudo apt-get update

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

docker exec -u root -it f83b5c5bf413 ash
f83b5c5bf413”是我的容器ID&以下是我的终端的工作示例:

与此不同,我使用的是
usermod

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

apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit
请记住在更新后保存图像。使用
docker ps
获取当前正在运行的docker,然后运行
docker commit-m“added sudo user”
保存docker映像

然后用以下方法进行测试:

su fruit
sudo whoami
或在启动docker时直接登录(确保先保存图像)作为非root用户进行测试:

docker run -it --user fruit <IMAGE>
sudo whoami

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

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

通过将用户添加到sudoers组,可以在不使用sudo的情况下使用docker。对此进行了更详细的解释

sudo groupadd docker
sudo usermod -aG docker $USER

将$USER替换为要使用它的用户的名称。

只需将sudo group交给USER即可。在centos中不起作用。
adduser
命令为CentOS提供了
useradd
的使用帮助,您可以添加一个用户和组,然后在
/etc/sudoers.d/
下创建一个碎片文件,并将该文件的权限设置为
440
。然后用户将在CentOS、6及更高版本下拥有sudo访问权限。5您必须添加
#includedir/etc/sudoers.d
指令,该指令在
/etc/sudoers
中不适用于我。我有这些错误:E:无法打开锁文件/var/lib/apt/lists/lock-open(13:权限被拒绝)E:无法锁定目录/var/lib/apt/lists/这似乎不适用于Ubuntu18.04 docker图像我使用的是
Ubuntu:bionic-20180724.1
。我使用了这种方法,但是在上面的步骤之后,它不允许我安装另一个包。我在上面的
Dockerfile
后面加了一行,以便安装一个包:
RUN apt get install-y tree
。但是,它给了我这个错误消息:
Step xxxx/xxxx:RUN apt get install-y tree-->Running in j5e6gsvwfafa Reading package list。。。E:无法打开锁文件/var/lib/apt/lists/lock-open(13:权限被拒绝)E:
apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit
su fruit
sudo whoami
docker run -it --user fruit <IMAGE>
sudo whoami
sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password
RUN echo "user ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/user && \
    chmod 0440 /etc/sudoers.d/user
sudo groupadd docker
sudo usermod -aG docker $USER