J'essaie d'ajouter un fichier à une image Docker construite à partir de l' tomcat
image officielle . 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 a des autorisations 644
et 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 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
root
? Pourquoi ne tiennent-ils pas compte de laUSER
directive?Depuis Docker 17.09, on peut utiliser l'
--chown
indicateur 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.Les autres alternatives sont:
la source