Wie lösche ich Berechtigungen in einem Skript in einer nicht interaktiven Shell?

2

Ich verwende Docker, um Bilder zu erstellen, die ich als Container ausführen kann. Ich konfiguriere mein Image ausschließlich als Root-Benutzer, einschließlich der Einrichtung von Volumes und anderen Dingen. Aber sobald ich alles konfiguriert habe, möchte ich einem nicht privilegierten Benutzer die Berechtigungen zum Ausführen meiner eigentlichen Anwendung entziehen. Folgendes versuche ich derzeit zu tun:

# Do privileged stuff
su myuser -c "myapplicationcommand $@"

Wenn diese Container jedoch bereitgestellt werden, wird anscheinend eine nicht interaktive Shell ausgeführt, da der folgende Fehler angezeigt wird:

su: must be run from a terminal

Offensichtlich muss der Befehl "su" in einer interaktiven Shell ausgeführt werden. Meine Frage lautet also: Wie kann ich Berechtigungen aus einer nicht interaktiven Shell entfernen, damit meine Anwendung als Benutzer ohne Rootberechtigung in meinem Docker-Container ausgeführt werden kann?

dsw88
quelle

Antworten:

1

Alte Frage, aber ich sehe nicht viele gute Antworten, also füge ich dieses Update hinzu in der Hoffnung, dass es anderen hilft:

Sie können die Optionen docker run -t und docker exec -it verwenden, um pty in Ihrer docker exec-Sitzung zuzuweisen. Hier gibt es eine gute Frage und Antwort: https://github.com/docker/docker/issues/8631

Dies ist einfacher: Sie müssen die Art und Weise, in der Sie den Container erstellen oder ausführen, nicht ändern. Mit docker exec können Sie einfach die Option -u verwenden, um sich als verschiedene Benutzer am Container anzumelden und die Verwendung von su zu vermeiden. z.B

$ docker exec -u root -it small_hypatia bash

$ docker exec -u someone-else -it small_hypatia bash

Eine allgemeinere Antwort zum Lösen von "su: muss von einem Terminal ausgeführt werden" finden Sie hier. Insbesondere ist es nützlich zu wissen, wie 'ssh -t' und 'ssh -tt' verwendet werden können. Der Python-Pty-Zuweisungs-Hack kann auch verwendet werden, um Su für jemanden mit demselben Problem zum Laufen zu bringen. https://stackoverflow.com/questions/36944634/su-command-in-docker-returns-must-be-run-from-terminal/41872292#41872292

Gaoithe
quelle
0

Normalerweise hätte su keine Abhängigkeit von einem tty. Wenn es jedoch etwas gibt, das die Verwendung von su behindert, können Sie das auch mit sudo tun.

Christopher Cox
quelle
0

Sie können verwenden

RUN adduser myuser
USER myuser
RUN foo
CMD bar

Sowohl foo (während des Builds) als auch bar (zur Laufzeit) werden als myuser ausgeführt.

Sean McLaughlin
quelle
Und wo würde das OP diese Zeilen setzen?
G-Man
Ich gehe davon aus, dass der Autor, da er die Docker-Images erstellt, weiß, wie er sie in die Docker-Datei einfügt.
Sean McLaughlin
Ich denke, das OP möchte privilegierte Dinge tun, wenn der Container gestartet wird, anstatt den Docker-Container zu erstellen. Ein Beispiel wäre das Mounten eines NFS-Dateisystems. Nach Abschluss dieses Vorgangs sollte der Dienst, für den der Docker-Container entwickelt wurde, als Nicht-Root-Benutzer ausgeführt werden.
Dpwrussell