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


当前回答

主要思想是,您需要根据容器创建一个根用户。

主要命令:

RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo

第一个将字面值bot:bot发送给chpasswd, chpasswd创建了用户bot,密码为bot, chpasswd做的是:

The chpasswd command reads a list of user name and password pairs from standard input and uses this information to update a group of existing users. Each line is of the format:

user_name:password

By default the supplied password must be in clear-text, and is encrypted by chpasswd. Also the password age will be updated, if present.

我假设第二个命令将用户bot添加为sudo。

完整的docker容器来玩:

FROM continuumio/miniconda3
# FROM --platform=linux/amd64 continuumio/miniconda3

MAINTAINER Brando Miranda "me@gmail.com"

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    ssh \
    git \
    m4 \
    libgmp-dev \
    opam \
    wget \
    ca-certificates \
    rsync \
    strace \
    gcc \
    rlwrap \
    sudo

# https://github.com/giampaolo/psutil/pull/2103

RUN useradd -m bot
# format for chpasswd user_name:password
RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo

WORKDIR /home/bot
USER bot
#CMD /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"]

如何在CentOS上做到这一点还没有答案。 在Centos上,您可以在Dockerfile中添加以下内容

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

如果你想连接到容器并安装一些东西 使用apt-get 首先,如上所述,我们的兄弟“Tomáš Záluský”

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

然后试着

运行apt-get update或apt-get '任何你想要的东西'

这对我很有效 希望对大家有用

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

不像公认的答案,我使用usermod代替。

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

apt update && apt install sudo
adduser fruit
usermod -aG sudo fruit

记得更新后保存图像。使用docker ps获取当前正在运行的docker的<CONTAINER ID>和<IMAGE>,然后使用docker commit -m "added sudo user" <CONTAINER ID> <IMAGE>保存docker IMAGE。

然后测试:

su fruit
sudo whoami

或者在启动docker时以非root用户直接登录(确保先保存映像)进行测试:

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

可以使用sudo -k重置密码提示时间戳:

sudo whoami # No password prompt
sudo -k # Invalidates the user's cached credentials
sudo whoami # This will prompt for password