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 darstellt. Dieser Benutzer sollte jedoch in der Lage sein, sudo im Container 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
Wenn ich diesen Container ausführe, 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 mit in meiner Docker-Datei zu installieren
RUN apt-get install sudo
Dies führt dazu, dass das Paket sudo nicht gefunden werden kann
docker
sudo
linux-containers
drubb
quelle
quelle
Antworten:
Ich habe es gerade verstanden. Wie Regan betonte, musste ich den Benutzer zur Sudoers-Gruppe hinzufügen. Der Hauptgrund war jedoch, dass ich vergessen hatte, den Repositorys-Cache zu aktualisieren, sodass apt-get das sudo-Paket nicht finden konnte. Es funktioniert jetzt. Hier ist der vollständige Code:
quelle
adduser
Befehl spuckt die Verwendungshilfe füruseradd
/etc/sudoers.d/
und die Berechtigungen für440
diese Datei festlegen . Dann hätte der Benutzer unter CentOS, 6 und höher, Sudo-Zugriff. 5 Sie müssen die#includedir /etc/sudoers.d
Direktive in/etc/sudoers
Wenn weder sudo noch apt-get im Container verfügbar sind, können Sie mit dem Befehl auch als Root-Benutzer in den laufenden Container springen
quelle
Die anderen Antworten haben bei mir nicht funktioniert. Ich suchte weiter und fand einen Blog-Beitrag , in dem beschrieben wurde, wie ein Team in einem Docker-Container ohne Root ausgeführt wurde.
Hier ist die TL; DR-Version:
Ich habe dafür verwendet
FROM node:9.3
, aber ich vermute, dass andere ähnliche Containerbasen auch funktionieren würden.quelle
ubuntu:bionic-20180724.1
. Ich habe diesen Ansatz verwendet, aber nach dem oben Gesagten kann ich kein anderes Paket installieren. Ich habe eine Zeile an das Obige angehängtDockerfile
, um ein Paket mit zu installieren :RUN apt-get install -y tree
. Es gab mir jedoch diese Fehlermeldung:Step xxxx/xxxx : RUN apt-get install -y tree ---> Running in j5e6gsvwfafa Reading package lists... E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to lock directory /var/lib/apt/lists/
RUN sudo apt-get install -y tree
. Nachdem Sie dasUSER
auf etwas anderes als gesetzt habenroot
, müssen Sie essudo
für alle Befehle verwenden, für dieroot
Berechtigungen erforderlich sind .sudo
es in einer Docker-Datei erlaubt ist.Für alle, die dieses Problem mit einem bereits laufenden Container haben und nicht unbedingt neu erstellen möchten, stellt der folgende Befehl eine Verbindung zu einem laufenden Container mit Root-Rechten her:
Sie können eine Verbindung auch über die ID und nicht über den Namen herstellen, indem Sie Folgendes suchen:
So speichern Sie Ihre Änderungen, damit sie beim nächsten Start des Containers (oder des Docker-Compose-Clusters) noch vorhanden sind:
So starten Sie einen Container, der nicht ausgeführt wird, und stellen eine Verbindung als root her:
So kopieren Sie aus einem laufenden Container:
So exportieren Sie eine Kopie des Bildes:
Welche Sie in einer anderen Docker-Installation wiederherstellen können, indem Sie:
Es ist viel schneller, benötigt aber mehr Platz, um nicht zu komprimieren.
Und:
quelle
Wenn Sie eine Verbindung zum Container herstellen und etwas
mit apt-get installieren möchten,
antworten Sie zuerst wie oben von unserem Bruder "Tomáš Záluský".
dann versuche es
es hat bei mir funktioniert hoffentlich ist es für alle nützlich
quelle
Wenn auf SUDO oder apt-get im Container nicht zugegriffen werden kann, können Sie die folgende Option zum Ausführen des Containers verwenden.
" f83b5c5bf413" ist meine Container-ID und hier ist ein Arbeitsbeispiel von meinem Terminal:
quelle
So richte ich einen Nicht-Root-Benutzer mit dem Basis-Image ein
ubuntu:18.04
:Was passiert mit dem obigen Code:
foo
werden erstellt.foo
wird sowohl zur Gruppefoo
als auch zursudo
Gruppe hinzugefügt .uid
undgid
wird auf den Wert von gesetzt999
./home/foo
./bin/bash
.sed
Befehl führt Inline - Aktualisierungen der/etc/sudoers
Datei zu ermöglichenfoo
undroot
an den Zugangs passwordless Benutzer -sudo
Gruppe.sed
Befehl deaktiviert die#includedir
Anweisung, mit der Dateien in Unterverzeichnissen diese Inline-Aktualisierungen überschreiben können.quelle
Wenn Sie einen Container als root ausführen, der ein Skript ausführt (das Sie nicht ändern können), das Zugriff auf den
sudo
Befehl benötigt, können Sie einfach ein neuessudo
Skript in Ihrem erstellen$PATH
, das den übergebenen Befehl aufruft.zB In Ihrer Docker-Datei:
quelle
-e
aus dem entfernenecho
. Andernfalls ist es in der Datei selbst vorhanden, wodurch es nicht mehr funktionsfähig ist.sudo -E ls
. Es wird versucht, auszuführen-E ls
.Dies funktioniert möglicherweise nicht für alle Bilder, aber einige Bilder enthalten bereits einen Root-Benutzer, z. B. im jupyterhub / singleuser-Bild. Mit diesem Bild ist es einfach:
quelle
Verwenden Sie Alias.
Einfach aber effizient. Vergessen Sie nicht, es an ~ / .bash_aliases anzuhängen, damit es funktioniert, nachdem Sie eine neue Shell geöffnet haben.
Da der Benutzer in Docker das Standard- Root- Verzeichnis ist, ist das Ignorieren des Befehls sudo der einfachste Weg.
quelle
Im Gegensatz zu akzeptierten Antworten verwende ich
usermod
stattdessen.Angenommen, Sie sind bereits als Root im Docker angemeldet und "ruit "ist der neue Nicht-Root-Benutzername, den ich hinzufügen möchte. Führen Sie einfach die folgenden Befehle aus:
Denken Sie daran, das Bild nach dem Update zu speichern. Verwenden Sie
docker ps
diese Option, um die <CONTAINER ID> und <IMAGE> des aktuellen Dockers abzurufen, und führen Sie sie dann ausdocker commit -m "added sudo user" <CONTAINER ID> <IMAGE>
, um das Docker-Image zu speichern.Dann testen mit:
Oder testen Sie durch direktes Anmelden (stellen Sie sicher, dass das Bild zuerst gespeichert wird) als Nicht-Root-Benutzer, wenn Sie Docker starten:
Sie können den
sudo -k
Zeitstempel für die Kennwortabfrage zurücksetzen:quelle