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

Ich versuche, einem Docker-Image, das aus dem Offiziellen erstellt wurde, eine Datei hinzuzufügen tomcat Bild. Dieses Bild scheint keine Root-Rechte zu haben, da ich als Benutzer angemeldet bin tomcat wenn ich bash starte:

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

Wenn ich eine Anweisung gebe Dockerfile um eine Datei in diesen Container zu kopieren, verfügt die Datei über Berechtigungen 644 und der Besitzer ist root. Soweit ich weiß, scheint das vernünftig zu sein, da alle Befehle in der Docker-Datei als root ausgeführt werden. Wenn ich jedoch versuche, den Besitz dieser Datei in zu ändern tomcat:tomcat, Ich bekomme eine Operation not permitted Fehlermeldung.

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

Wie es reproduziert werden kann:

mkdir docker-addfilepermissioncd docker-addfilepermissiontouch test.txtecho 'FROM tomcatCOPY test.txt /usr/local/tomcat/webapps/RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfiledocker build .

Die Ausgabe von docker build .:

Sending build context to Docker daemon 3.072 kBSending build context to Docker daemon Step 0 : FROM tomcat ---> 44859847ef64Step 1 : COPY test.txt /usr/local/tomcat/webapps/ ---> Using cache ---> a2ccb92480a4Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt ---> Running in 208e7ff0ec8fchown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted2014/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

Es gibt wahrscheinlich eine Möglichkeit, die Docker-Datei 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 danach aufheben möchten (was empfohlen wird), 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 Ihre Docker-Datei als root starten und Tomcat und all das installieren können. Es ist eigentlich seltsam, dass sie das aus meiner Erfahrung in ihrem Image ändern. Es ist sinnvoll, dem beabsichtigten Endbenutzer die Möglichkeit zu geben, die Benutzerrichtlinie nach eigenem Ermessen festzulegen.

Seit Docker 17.09 kann man die --chown markieren Sie ADD / COPY-Vorgänge in Dockerfile, um den Eigentümer im ADD / COPY-Schritt selbst zu ändern, anstatt eine separate Ausführungsoperation mit chown , die die Größe des Bildes erhöht, wie Sie bemerkt haben. Es wäre gut gewesen, dies als Standardmodus zu haben, 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 beeinträchtigen und führte daher ein neues Flag 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. Zerquetsche die Schichten!