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.
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.
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.
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/