web-dev-qa-db-fra.com

Docker Copy et changer de propriétaire

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

38

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.

7

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.

65
Georgi Hristozov

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/
0
Ohad Cohen