web-dev-qa-db-fra.com

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

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

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

Si je demande à un Dockerfile de copier un fichier dans ce conteneur, le fichier dispose des autorisations 644 et le propriétaire est root. 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'ai un Operation not permitted Erreur.

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
18
nyi

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 consiste à 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 cela. 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.

20

Depuis Docker 17.09, on peut utiliser le --chown drapeau 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 cela 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 bootstrap qui modifie la propriété.
  3. Écrasez les couches!
9
Vinayak Gadkari