如何在docker容器中使用sudo?

How to use sudo inside a docker container?

通常,使用用户root运行docker容器。 我想使用不同的用户,使用docker的USER指令没问题。 但是这个用户应该能够在容器内使用sudo。 缺少此命令。

这是一个简单的Dockerfile用于此目的:

1
2
3
4
5
6
7
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包

1
RUN apt-get install sudo

这导致无法找到包sudo


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

1
2
3
4
5
6
7
8
9
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版本:

1
2
3
4
5
6
7
8
9
10
11
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

我正在使用FROM node:9.3,但我怀疑其他类似的容器基地也能正常工作。


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

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

如果你想连接到容器并安装一些东西
使用apt-get
首先是我们的兄弟"Tomá?Zálusky"的上述回答

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

然后尝试

RUN apt-get update or apt-get 'anything you want'

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


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

1
docker exec -ti -u root container_name bash

您还可以使用其ID而不是其名称进行连接,方法是:

1
docker ps -l

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

1
docker commit container_id image_name

要启动未运行的容器并以root身份连接:

1
docker run -ti -u root --entrypoint=/bin/bash container_name -s

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

1
docker cp <containerId>:/file/path/within/container /host/path/target

要导出图像的副本:

1
docker save container | gzip > /dir/file.tar.gz

您可以使用以下命令恢复到另一个Docker安装:

1
gzcat /dir/file.tar.gz | docker load

使用以下内容可以更快,但需要更多空间来进行压缩:

1
docker save container | dir/file.tar

和:

1
cat dir/file.tar | docker load

如果您有一个以root身份运行的容器来运行需要访问sudo命令的脚本(您无法更改),则可以在$PATH中创建一个新的sudo脚本来调用传递的命令。

例如在你的Dockerfile中:

1
2
3
4
5
6
7
RUN if type sudo 2>/dev/null; then \
     echo"The sudo command already exists... Skipping."; \
    else \
     echo -e"#!/bin/sh
\${@}"> /usr/sbin/sudo; \
     chmod +x /usr/sbin/sudo; \
    fi