web-dev-qa-db-de.com

Docker Kopieren Sie und ändern Sie den Besitzer

Angesichts der folgenden Dockerfile

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
MKDIR /data
COPY test/ /data/test data
RUN chown -R john:mygroup /data
CMD /bin/bash

In meinem kopierten Testverzeichnis habe ich die Dateiberechtigungen auf 770 gesetzt.

Wenn ich einen su john in meinem Container mache, kann ich nicht auf die Dateien oder Unterverzeichnisse in meinem Testverzeichnis zugreifen. Es hat den Anschein, dass dieses Problem mit dem Besitz des Dateisystems "aufs" zusammenhängt, bei dem das kopierte Verzeichnis immer noch root gehört und die Berechtigungen auf 770 gesetzt sind.

Gibt es eine Problemumgehung für dieses Problem, um die Berechtigungen richtig festzulegen? Möglicherweise müssen Sie die Berechtigungen des ursprünglichen Verzeichnisses auf die Benutzer-ID des Containerbenutzers festlegen, bevor Sie es kopieren. Dies scheint jedoch eher ein Hack zu sein.

38

Ich glaube, ich habe eine Lösung gefunden, die funktioniert. Die Verwendung eines Datenvolumencontainers führt dazu. Zuerst erstelle ich den Data Volume Container, der die Kopie meines externen Verzeichnisses enthält:

FROM busybox
RUN mkdir /data
VOLUME /data
COPY /test /data/test
CMD /bin/sh

In meinem Anwendungscontainer, wo ich meine Benutzer habe, könnte das ungefähr so ​​aussehen

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
COPY setpermissions.sh /root/setpermissions.sh
CMD /root/setpermissions.sh && /bin/bash

Das setpermissions-Skript dient zum Festlegen der Benutzerberechtigungen:

#!/bin/bash

if [ ! -e /data/.bootstrapped ] ; then
  chown -R john:mygroup /data
  touch /data/.bootstrapped
fi

Jetzt muss ich nur noch den --volumes-from <myDataContainerId> verwenden, wenn der Anwendungscontainer ausgeführt wird.

7

Ein --chown-Flag wurde schließlich zu COPY hinzugefügt:

COPY --chown=patrick hostPath containerPath

Diese neue Syntax scheint auf Docker 17.09 zu funktionieren.

Siehe die PR für weitere Informationen.

65

Ich kopiere die Dateien in ein temporäres Verzeichnis (z. B. /tmp/) und verwende sie dann mit RUN cp, wann immer ich will.

COPY myfile /tmp/
RUN cp -r /tmp/myfile /target/path/
0
Ohad Cohen