Comment ajouter un fichier à un conteneur Docker qui n'a pas d'autorisations root?

16

J'essaie d'ajouter un fichier à une image Docker construite à partir de l' tomcatimage officielle . Cette image ne semble pas avoir de droits root, car je suis connecté en tant qu'utilisateur tomcatsi j'exécute bash:

docker run -it tomcat /bin/bash
tomcat@06359f7cc4db:/usr/local/tomcat$ 

Si je demande à un Dockerfilede copier un fichier dans ce conteneur, le fichier a des autorisations 644et le propriétaire l'est root. Pour autant que je sache, cela semble raisonnable car toutes les commandes du Dockerfile sont exécutées en tant que root. Cependant, si j'essaye de changer la propriété de ce fichier en tomcat:tomcat, j'obtiens une Operation not permittederreur.

Pourquoi ne puis-je pas modifier les autorisations d'un fichier copié sur cette image?

Comment le reproduire:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

La sortie de docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1
nyi
la source

Réponses:

20

Il existe probablement un moyen d'afficher et de modifier le Dockerfile pour tomcat, mais je ne peux pas le comprendre après quelques minutes. Ma solution inélégante est d'ajouter cette ligne avant le chown:

USER root

Si vous souhaitez réduire les privilèges après (ce qui est recommandé), vous pouvez ajouter cette ligne:

USER tomcat

Alternativement, travaillez avec une image sur laquelle aucun logiciel n'est installé afin que vous puissiez commencer votre Dockerfile en tant que root et installer tomcat et tout ça. C'est en fait étrange qu'ils changent cela à leur image d'après mon expérience. Il est logique de permettre à l'utilisateur final prévu de définir la directive USER comme bon lui semble.

theterribletrivium
la source
Cela fonctionne en effet! Savez-vous par hasard pourquoi les commandes ADD et COPY créent des fichiers avec le propriétaire root? Pourquoi ne tiennent-ils pas compte de la USERdirective?
nyi
1
Eh bien, généralement, vous ne voyez pas d'images de base définir la directive, car il n'y a pas de véritable moyen de savoir quels comptes d'utilisateurs seront sur le système. Il peut également être plus facile de simplement créer les fichiers en tant que root, car c'est ce que Docker doit exécuter. Cela semble être une demande d'amélioration raisonnable, cela simplifierait la création de Dockerfiles si les choses pouvaient automatiquement appartenir à ce qui était défini dans la directive USER.
theterribletrivium
Merci, m'a vraiment mis hors de ma misère. J'avais besoin d'ajouter des clés ssh dans une image Jenkins.
Kostas Demiris
8

Depuis Docker 17.09, on peut utiliser l' --chownindicateur sur les opérations ADD / COPY dans Dockerfile pour changer le propriétaire dans l'étape ADD / COPY elle-même plutôt qu'une opération RUN distincte avec chown qui augmente la taille de l'image comme vous l'avez noté. Il aurait été bon d'avoir ceci comme mode par défaut, c'est-à-dire que les autorisations de l'utilisateur copiant les fichiers sont appliquées aux fichiers copiés. Cependant, l'équipe Docker ne voulait pas rompre la compatibilité descendante et a donc introduit un nouveau drapeau.

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

Les autres alternatives sont:

  1. Modifiez l'autorisation dans un dossier intermédiaire avant de créer l'image.
  2. Exécutez le conteneur via un script d'amorçage qui modifie la propriété.
  3. Écrasez les couches!
Vinayak Gadkari
la source