Wie füge ich eine Datei zu einem Docker-Container hinzu, der keine Root-Berechtigungen hat?

16

Ich versuche, einem Docker-Image, das aus dem offiziellen tomcatImage erstellt wurde , eine Datei hinzuzufügen . Dieses Image scheint keine Root-Rechte zu haben, da ich als Benutzer angemeldet bin, tomcatwenn ich bash ausführe:

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

Wenn ich a Dockerfileanweise, eine Datei in diesen Container zu kopieren, hat die Datei Berechtigungen 644und der Besitzer ist root. Soweit ich weiß, scheint dies sinnvoll zu sein, da alle Befehle in der Docker-Datei als root ausgeführt werden. Wenn ich jedoch versuche, den Besitz dieser Datei zu ändern tomcat:tomcat, wird eine Operation not permittedFehlermeldung angezeigt.

Warum kann ich die Berechtigungen einer auf dieses Image kopierten Datei nicht ändern?

Wie es reproduziert werden kann:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

Die Ausgabe von docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1
Nyi
quelle

Antworten:

20

Es gibt wahrscheinlich eine Möglichkeit, das Dockerfile für Tomcat anzuzeigen und zu ändern, aber ich kann es nach ein paar Minuten nicht herausfinden. Meine unelegante Lösung besteht darin, diese Zeile vor dem Chown hinzuzufügen:

USER root

Wenn Sie die Berechtigungen nach (was empfohlen wird) herabsetzen möchten, können Sie diese Zeile hinzufügen:

USER tomcat

Alternativ können Sie mit einem Image arbeiten, auf dem keine Software installiert ist, sodass Sie Dockerfile als Root starten und Tomcat und all das installieren können. Eigentlich ist es seltsam, dass sie das in ihrem Image aus meiner Erfahrung ändern. Es ist sinnvoll, dem Endbenutzer zu gestatten, die USER-Direktive nach eigenem Ermessen festzulegen.

theterribletrivium
quelle
Das funktioniert wirklich! Wissen Sie zufällig, warum die Befehle ADD und COPY Dateien mit dem Eigentümer erstellen root? Warum USERberücksichtigen sie die Richtlinie nicht?
nyi
1
Normalerweise sehen Sie keine Basis-Images, die die Direktive festlegen, da es keine echte Möglichkeit gibt, die Benutzerkonten im System zu bestimmen. Es kann auch einfacher sein, die Dateien einfach als root zu erstellen, da Docker als solches ausgeführt werden muss. Es scheint eine sinnvolle Erweiterungsanforderung zu sein, die das Erstellen von Dockerfiles vereinfachen würde, wenn die Dinge automatisch dem gehören könnten, was in der USER-Direktive festgelegt wurde.
Theterribletrivium
Danke. Bring mich wirklich aus meinem Elend. Ich musste ssh-Schlüssel in ein Jenkins-Image einfügen.
Kostas Demiris
8

Seit Docker 17.09 können Sie das --chownFlag für ADD / COPY-Vorgänge in Dockerfile verwenden, um den Eigentümer im ADD / COPY-Schritt selbst zu ändern, anstatt einen separaten RUN-Vorgang mit chown auszuführen, der das Bild vergrößert, wie Sie bemerkt haben. Es wäre gut gewesen, dies als Standardmodus zu verwenden, dh die Berechtigungen des Benutzers, der die Dateien kopiert, werden auf die kopierten Dateien angewendet. Das Docker-Team wollte jedoch die Abwärtskompatibilität nicht aufheben und führte daher eine neue Flagge ein.

COPY --chown=<user>:<group> <hostPath> <containerPath>

Die anderen Alternativen sind:

  1. Ändern Sie die Berechtigung in einem Staging-Ordner, bevor Sie das Image erstellen.
  2. Führen Sie den Container über ein Bootstrap-Skript aus, das den Eigentümer ändert.
  3. Squash die Schichten!
Vinayak Gadkari
quelle