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


当前回答

我使用的是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

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

主要命令:

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

其他答案对我不起作用。我继续搜索,发现了一篇博客文章,介绍了一个团队如何在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: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指令,该指令将允许子目录中的任何文件覆盖这些内联更新。

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

解决方法如下:

apt-get更新 安装sudo