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


当前回答

其他答案对我不起作用。我继续搜索,发现了一篇博客文章,介绍了一个团队如何在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 

为此,我使用FROM node:9.3,但我怀疑其他类似的容器基础也可以工作。

其他回答

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

解决方法如下:

apt-get更新 安装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

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

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

Centos7的Dockerfile示例。在本例中,我们添加了具有sudo权限的prod_user。

FROM centos:7

RUN yum -y update && yum clean all

RUN yum -y install openssh-server  python3 sudo

RUN adduser -m prod_user && \
    echo "MyPass*49?" | passwd prod_user --stdin && \
    usermod -aG wheel prod_user && \
    mkdir /home/prod_user/.ssh && \
    chown prod_user:prod_user -R  /home/prod_user/ && \
    chmod 700 /home/prod_user/.ssh

RUN echo "prod_user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "%wheel ALL=(ALL) ALL" >> /etc/sudoers

RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config

RUN systemctl enable sshd.service

VOLUME [ "/sys/fs/cgroup" ]

ENTRYPOINT ["/usr/sbin/init"]

其他答案对我不起作用。我继续搜索,发现了一篇博客文章,介绍了一个团队如何在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 

为此,我使用FROM node:9.3,但我怀疑其他类似的容器基础也可以工作。