通常,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


当前回答

刚刚明白。正如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

其他回答

如果您有一个以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

当容器中sudo和apt-get都不可用时,还可以使用命令以根用户身份跳转到正在运行的容器

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

如果SUDO或apt-get在容器内不可访问,您可以在运行的容器中使用下面的选项。

docker exec -u root -it f83b5c5bf413 ash

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

这可能不适用于所有映像,但有些映像已经包含根用户,例如jupyterhub/singleuser映像。对于这个图像,它很简单:

USER root
RUN sudo apt-get update

我使用的是Ubuntu映像,在使用docker桌面时曾遇到过这个问题。

解决方法如下:

apt-get更新 安装sudo