509 Stimmen

Wie man sudo innerhalb eines Docker-Containers verwendet?

Normalerweise werden Docker-Container unter Verwendung des Benutzers root ausgeführt. Ich möchte einen anderen Benutzer verwenden, was kein Problem ist, wenn man die USER-Anweisung von Docker verwendet. Aber dieser Benutzer sollte innerhalb des Containers sudo verwenden können. Diese Befehl fehlt.

Hier ist ein einfaches Dockerfile für diesen Zweck:

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

Bei der Ausführung dieses Containers werde ich mit dem Benutzer 'docker' angemeldet. Wenn ich versuche, sudo zu verwenden, wird der Befehl nicht gefunden. Also habe ich versucht, das sudo-Paket in meinem Dockerfile zu installieren mit

RUN apt-get install sudo

Dies führt zu Paket sudo konnte nicht gefunden werden

15voto

林果皞 Punkte 6931

Im Gegensatz zur akzeptierten Antwort verwende ich stattdessen usermod.

Angenommen, Sie sind bereits als Root in Docker angemeldet, und "fruit" ist der neue nicht-root Benutzer, den Sie hinzufügen möchten, führen Sie einfach diese Befehle aus:

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

Vergessen Sie nicht, das Bild nach dem Update zu speichern. Verwenden Sie docker ps, um die aktuell laufende Docker- und zu erhalten, und führen Sie dann docker commit -m "sudo-Benutzer hinzugefügt" aus, um das Docker-Bild zu speichern.

Dann testen Sie mit:

su fruit
sudo whoami

Oder testen Sie durch direkte Anmeldung (stellen Sie sicher, dass Sie das Bild zuerst speichern) als dieser nicht-root Benutzer beim Starten von Docker:

docker run -it --user fruit 
sudo whoami

Sie können sudo -k verwenden, um den Zeitstempel für die Passwortabfrage zurückzusetzen:

sudo whoami # Keine Passwortabfrage
sudo -k # Ungültigeates die zwischengespeicherten Anmeldeinformationen des Benutzers
sudo whoami # Dies fordert ein Passwort an

12voto

Yogi Ghorecha Punkte 1256

Wenn SUDO oder apt-get nicht innerhalb des Containers zugänglich ist, können Sie die folgende Option verwenden, um den Container auszuführen.

docker exec -u root -it f83b5c5bf413 ash

"f83b5c5bf413" ist meine Container-ID & hier ist ein Beispiel aus meinem Terminal:

Bildbeschreibung hier eingeben

11voto

Seth Bergman Punkte 406

So richte ich einen Nicht-Root-Benutzer mit dem Basisbild von ubuntu:18.04 ein:

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 "Sudoers-Datei angepasst für passwortlose Zugriffe auf den Benutzer foo!" && \
    echo "Benutzer foo:";  su - foo -c id

Was mit dem obigen Code passiert:

  • Der Benutzer und die Gruppe foo werden erstellt.
  • Der Benutzer foo wird der Gruppe foo und der Gruppe sudo hinzugefügt.
  • Die uid und die gid werden auf den Wert 999 gesetzt.
  • Das Home-Verzeichnis wird auf /home/foo gesetzt.
  • Die Shell wird auf /bin/bash gesetzt.
  • Der sed-Befehl führt Inline-Updates der Datei /etc/sudoers durch, um dem Benutzer foo und dem Benutzer root passwortlosen Zugriff auf die Gruppe sudo zu ermöglichen.
  • Der sed-Befehl deaktiviert die #includedir-Anweisung, die es Dateien in Unterverzeichnissen ermöglichen würde, diese Inline-Updates zu überschreiben.

7voto

Alex Kaszynski Punkte 1946

Dies funktioniert möglicherweise nicht für alle Bilder, aber einige Bilder enthalten bereits einen Root-Benutzer, wie beispielsweise im jupyterhub/singleuser-Bild. Mit diesem Bild ist es einfach:

USER root
RUN sudo apt-get update

7voto

Charlie Parker Punkte 13101

Die Hauptidee ist, dass Sie einen Benutzer erstellen müssen, der gemäß dem Container ein Root-Benutzer ist.

Hauptbefehle:

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

Der erste Befehl sendet den Literalstring bot:bot an chpasswd, der den Benutzer bot mit dem Passwort bot erstellt, chpasswd macht das:

Der chpasswd-Befehl liest eine Liste von Benutzername- und Passwortpaaren aus der Standardeingabe und verwendet diese Informationen, um eine Gruppe von vorhandenen Benutzern zu aktualisieren. Jede Zeile hat das Format:

Benutzername:Passwort

Standardmäßig muss das bereitgestellte Passwort im Klartext vorliegen und wird von chpasswd verschlüsselt. Auch das Passwortalter wird aktualisiert, falls vorhanden.

Der zweite Befehl fügt meiner Annahme nach den Benutzer bot als sudo hinzu.

Voller Docker-Container zum Testen:

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 für chpasswd Benutzername:Passwort
RUN echo "bot:bot" | chpasswd
RUN adduser bot sudo

WORKDIR /home/bot
USER bot
#CMD /bin/bash

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X