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

417voto

Tomáš Záluský Punkte 8018

Wenn sowohl sudo als auch apt-get im Container nicht verfügbar sind, können Sie auch in den laufenden Container als Benutzer root mit dem Befehl springen:

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

386voto

drubb Punkte 15291

Geschafft. Wie Regan bemerkt hat, musste ich den Benutzer zur sudoers-Gruppe hinzufügen. Der Hauptgrund war jedoch, dass ich vergessen hatte, den Repositories-Cache zu aktualisieren, sodass apt-get das sudo-Paket nicht finden konnte. Es funktioniert jetzt. Hier ist der vollständige Code:

VON ubuntu:12.04

RUN apt-get update && \
      apt-get -y install sudo

RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo

BENUTZER docker
CMD /bin/bash

153voto

M. Scott Ford Punkte 2569

Die anderen Antworten haben für mich nicht funktioniert. Ich habe weiter gesucht und einen Blogbeitrag gefunden, der behandelte, wie ein Team nicht als Root-Benutzer innerhalb eines Docker-Containers lief.

Hier ist die TL;DR-Version:

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

# hier hatte ich Probleme mit den anderen Ansätzen
RUN sudo apt-get update 

Ich habe dafür FROM node:9.3 verwendet, aber ich vermute, dass auch andere ähnliche Container-Basen funktionieren würden.

90voto

Chris Punkte 4518

Für alle, die dieses Problem mit einem bereits laufenden Container haben und nicht unbedingt neu erstellen möchten, verbindet der folgende Befehl mit Root-Rechten mit einem laufenden Container:

docker exec -ti -u root container_name bash

Sie können sich auch mit seiner ID verbinden, anstatt mit seinem Namen, indem Sie ihn mit folgendem Befehl finden:

docker ps -l

Um Ihre Änderungen zu speichern, sodass sie beim nächsten Start des Containers (oder Docker-Compose-Clusters) noch vorhanden sind - beachten Sie, dass diese Änderungen nicht wiederholt werden, wenn Sie von Grund auf neu erstellen:

docker commit container_id image_name

Um zu einer früheren Bildversion zurückzukehren (Warnung: Dies löscht die History anstelle von hinten anzuhängen. Um eine Referenz zum aktuellen Bild zu behalten, taggen Sie es zuerst optional):

docker history image_name
docker tag latest_image_id my_descriptive_tag_name  # optional
docker tag desired_history_image_id image_name

Um einen Container zu starten, der nicht läuft, und sich als Root zu verbinden:

docker run -ti -u root --entrypoint=/bin/bash image_id_or_name -s

Um von einem laufenden Container zu kopieren:

docker cp :/file/path/within/container /host/path/target

Um eine Kopie des Bildes zu exportieren:

docker save container | gzip > /dir/file.tar.gz

Die Sie in eine andere Docker-Installation wiederherstellen können mit:

gzcat /dir/file.tar.gz | docker load

Es geht viel schneller, nimmt aber mehr Platz ein, um nicht zu komprimieren, zu verwenden:

docker save container | dir/file.tar

Und:

cat dir/file.tar | docker load

25voto

Ismail Punkte 1292

Wenn Sie eine Verbindung zum Container herstellen und etwas installieren möchten
mit apt-get
zuerst wie oben von unserem Bruder "Tomáš Záluský" beantwortet

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

versuchen Sie dann

FÜHREN Sie apt-get update oder apt-get 'was auch immer Sie wollen' aus

es hat bei mir funktioniert hoffe, es ist für alle nützlich

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