如何在docker容器中使用sudo?
通常,docker容器使用用户根运行。我想使用不同的用户,使用docker的用户指令没有问题。但是该用户应该能够在容器内使用sudo。缺少此命令 以下是一个用于此目的的简单Dockerfile:如何在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
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
如果容器内无法访问SUDO或apt 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