it-swarm.com.de

Wie verwende ich Sudo in einem Docker-Container?

Normalerweise werden Docker-Container mit dem Benutzer root ausgeführt. Ich möchte einen anderen Benutzer verwenden, was mit der USER-Direktive von docker kein Problem ist. Dieser Benutzer sollte jedoch in der Lage sein, Sudo innerhalb des Containers zu verwenden. Dieser Befehl fehlt.

Hier ist eine einfache Docker-Datei 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

Beim Ausführen 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

RUN apt-get install Sudo

Dies führt dazu, dass das Paket Sudo nicht gefunden werden kann

201
drubb

Habe es gerade. Wie regan betonte, musste ich den Benutzer der sudoers-Gruppe hinzufügen. Aber der Hauptgrund war, dass ich vergessen hatte, den Repository-Cache zu aktualisieren, sodass apt-get das Sudo-Paket nicht finden konnte. Es funktioniert jetzt. Hier ist der vollständige Code:

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
208
drubb

Wenn im Container weder Sudo noch apt-get verfügbar sind, können Sie mit dem Befehl auch in den laufenden Container als Root-Benutzer springen

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

Die anderen Antworten haben bei mir nicht funktioniert. Ich suchte weiter und fand einen Blogpost , der beschreibt, wie ein Team ohne Rootberechtigung in einem Docker-Container lief.

Hier ist die TL; DR-Version:

RUN apt-get update
RUN apt-get install 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 

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

48
M. Scott Ford

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

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

dann versuche es

RUN apt-get update oder apt-get "alles was du willst"

ich hoffe, es ist für alle nützlich

14
Ismail

Für alle Benutzer, die dieses Problem mit einem bereits ausgeführten Container haben und nicht unbedingt neu erstellen möchten, wird mit dem folgenden Befehl eine Verbindung zu einem ausgeführten Container mit Root-Berechtigungen hergestellt:

docker exec -ti -u root container_name bash

Sie können die Verbindung auch über die ID und nicht über den Namen herstellen, indem Sie Folgendes eingeben:

docker ps -l

So speichern Sie Ihre Änderungen, damit sie beim nächsten Start des Containers (oder Docker-Compose-Clusters) noch vorhanden sind:

docker commit container_id image_name

So starten Sie einen Container, der nicht ausgeführt wird, und stellen eine Verbindung als Root her:

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

So kopieren Sie aus einem laufenden Container:

docker cp <containerId>:/file/path/within/container /Host/path/target

So exportieren Sie eine Kopie des Bildes:

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

Welche können Sie auf eine andere Docker-Installation wiederherstellen mit:

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

Es ist viel schneller, benötigt jedoch mehr Platz, um nicht komprimiert zu werden.

docker save container | dir/file.tar

Und:

cat dir/file.tar | docker load
8
Chris

Wenn Sie einen Container als root ausführen, der ein Skript ausführt (das Sie nicht ändern können), das Zugriff auf den Befehl Sudo benötigt, können Sie einfach ein neues Sudo Skript in Ihrem $PATH erstellen, das das aufruft Befehl übergeben.

z.B. In Ihrem Dockerfile:

RUN if type Sudo 2>/dev/null; then \ 
     echo "The Sudo command already exists... Skipping."; \
    else \
     echo -e "#!/bin/sh\n\${@}" > /usr/sbin/Sudo; \
     chmod +x /usr/sbin/Sudo; \
    fi
2
XtraSimplicity