Comment puis-je copier Docker en tant que non root?

143

Lors de la création d'une image Docker, comment insérer COPYun fichier dans l'image pour que le fichier résultant appartienne à un utilisateur autre que root?

FGreg
la source

Réponses:

206

Pour les versions v17.09.0-ce et plus récentes

Utilisez l'indicateur facultatif --chown=<user>:<group>avec les commandes ADDou COPY.

Par exemple

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

La documentation de l'indicateur --chown est maintenant disponible sur la page principale de référence de Dockerfile .

Le problème 34263 a été fusionné et est disponible dans la version 17.09.0-ce .


Pour les versions antérieures à la v17.09.0-ce

Docker ne prend pas en charge en COPYtant qu'utilisateur autre que root. Vous devez chown/ chmodle fichier après la COPYcommande.

Exemple de 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"]

Avant la v17.09.0-ce, la référence Dockerfile pour la COPYcommande disait:

Tous les nouveaux fichiers et répertoires sont créés avec un UID et un GID de 0.


Historique Cette fonctionnalité a été suivie à travers plusieurs problèmes GitHub: 6119 , 9943 , 13600 , 27303 , 28499 , problème 30110 .

Le problème 34263 est le problème qui a implémenté la fonctionnalité d'indicateur facultatif et le problème 467 a mis à jour la documentation.

FGreg
la source
3
C'est frustrant, car chown-ing beaucoup de fichiers est devenu incroyablement lent depuis que l'overlay2 est devenu le pilote de stockage par défaut
hbogert
1
Oui, en plus, cela crée une grande couche d'image supplémentaire sans raison apparente (dans mon cas:> 300 Mo pour une exécution chownsur 40 Mo de fichiers).
Dirk
Il y a aussi un avantage à exécuter chown avec la commande COPY qui est la réduction de la taille. Si nous exécutons ces deux commandes séparément (COPY <host_path> <source_path>; chown other_user: other_user), cela crée une couche supplémentaire qui double finalement la taille de l'image.
abhishek thakur
Cette réponse est une bouée de sauvetage. Merci beaucoup, j'ai résolu un problème que je combattais depuis quelques heures.
Colby Hill le