Wie kann ich COPY als Nicht-Root andocken?

140

Wie füge ich beim Erstellen eines Docker-Images COPYeine Datei in das Image ein, sodass die resultierende Datei einem anderen Benutzer als root gehört?

FGreg
quelle

Antworten:

202

Für Versionen v17.09.0-ce und neuer

Verwenden Sie das optionale Flag --chown=<user>:<group>mit den Befehlen ADDoder COPY.

Beispielsweise

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

Die Dokumentation für das Flag --chown befindet sich jetzt auf der Hauptseite der Dockerfile-Referenz .

Ausgabe 34263 wurde zusammengeführt und ist in Version v17.09.0-ce verfügbar .


Für Versionen älter als v17.09.0-ce

Docker unterstützt keinen COPYanderen Benutzer als root. Sie müssen chown/ chmoddie Datei nach dem COPYBefehl.

Beispiel Dockerfile:

from centos:6
RUN groupadd -r myuser && adduser -r -g myuser myuser
USER myuser
#Install code, configure application, etc...
USER root
COPY run-my-app.sh /usr/local/bin/run-my-app.sh
RUN chown myuser:myuser /usr/local/bin/run-my-app.sh && \
    chmod 744 /usr/local/bin/run-my-app.sh
USER myuser
ENTRYPOINT ["/usr/local/bin/run-my-app.sh"]

Vor Version 17.09.0-ce lautete die Dockerfile-Referenz für den COPYBefehl:

Alle neuen Dateien und Verzeichnisse werden mit einer UID und GID von 0 erstellt.


Verlauf Diese Funktion wurde anhand mehrerer GitHub-Probleme verfolgt: 6119 , 9943 , 13600 , 27303 , 28499 , Ausgabe 30110 .

Problem 34263 ist das Problem, das die optionale Flag-Funktionalität implementiert hat, und Problem 467 hat die Dokumentation aktualisiert.

FGreg
quelle
3
Dies ist frustrierend, da das Chowning vieler Dateien unglaublich langsam geworden ist, da das Overlay2 zum Standard-Speichertreiber geworden ist
hbogert
1
Ja, außerdem wird ohne ersichtlichen Grund eine große zusätzliche Bildebene erstellt (in meinem Fall:> 300 MB für die Ausführung chownmit 40 MB Dateien).
Dirk
Es gibt auch einen Vorteil beim Ausführen von chown zusammen mit dem Befehl COPY, nämlich die Größenreduzierung. Wenn wir diese beiden Befehle separat ausführen (COPY <Host_Pfad> <Quelle_Pfad>; chown other_user: other_user), wurde eine zusätzliche Ebene erstellt, die schließlich die Bildgröße verdoppelt.
Abhishek Thakur
Diese Antwort ist ein Lebensretter. Vielen Dank, ein Problem gelöst, mit dem ich einige Stunden lang gekämpft hatte.
Colby Hill