Étant donné le fichier Docker suivant
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
Dans mon répertoire de test, qui est copié, j'ai défini les autorisations de fichier sur 770.
Si je fais un su john
dans mon conteneur, je ne peux accéder à aucun des fichiers ou sous-répertoires de mon répertoire de test. Il semble que ce problème soit lié à la propriété du système de fichiers aufs, où le répertoire copié appartient toujours à root et où les autorisations sont définies sur 770.
Existe-t-il une solution de contournement à ce problème pour définir les autorisations correctement? On pourrait par exemple définir les autorisations du répertoire d'origine sur l'ID utilisateur du conteneur avant de le copier. Mais cela ressemble plus à un hack.
Je pense avoir trouvé une solution qui fonctionne. L'utilisation d'un conteneur de volume de données fera l'affaire. Tout d'abord, je crée le conteneur de volumes de données, qui contient la copie de mon répertoire externe:
FROM busybox
RUN mkdir /data
VOLUME /data
COPY /test /data/test
CMD /bin/sh
Dans mon conteneur d'applications, où se trouvent mes utilisateurs, ce qui pourrait ressembler à ceci
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
Le script setpermissions définit les autorisations utilisateur:
#!/bin/bash
if [ ! -e /data/.bootstrapped ] ; then
chown -R john:mygroup /data
touch /data/.bootstrapped
fi
Il ne me reste plus qu'à utiliser le --volumes-from <myDataContainerId>
lors de l'exécution du conteneur d'applications.
Un drapeau --chown
a finalement été ajouté à COPY
:
COPY --chown=patrick hostPath containerPath
Cette nouvelle syntaxe semble fonctionner sur Docker 17.09.
Voir le PR pour plus d'informations.
Je copie les fichiers dans un répertoire temporaire (e, g: /tmp/
) puis utilise RUN cp
pour les copier à tout moment.
COPY myfile /tmp/
RUN cp -r /tmp/myfile /target/path/