web-dev-qa-db-fra.com

pourquoi chown ne fonctionne-t-il pas dans Dockerfile?

My Dockerfile crée un répertoire, le chown, puis le répertorie ensuite. Le répertoire est toujours la propriété de root. Pourquoi donc?

Voici le Dockerfile:

FROM ubuntu:precise
RUN useradd -d /home/testuser -m -s /bin/bash testuser
RUN mkdir -p /var/local/testrunner/logs
VOLUME ["/var/local/testrunner/logs"]
RUN grep testuser /etc/passwd
RUN grep root /etc/passwd
RUN chown -R testuser:testuser /var/local/testrunner/logs
RUN ls -ld /var/local/testrunner/logs 

Voici le résultat de "docker build":

Sending build context to Docker daemon 10.24 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:precise
 ---> ab8e2728644c
Step 1 : RUN useradd -d /home/testuser -m -s /bin/bash testuser
 ---> Using cache
 ---> 640f12671c86
Step 2 : RUN mkdir -p /var/local/testrunner/logs
 ---> Using cache
 ---> bf7756fd5b1f
Step 3 : VOLUME ["/var/local/testrunner/logs"]
 ---> Using cache
 ---> 65c73ee76c20
Step 4 : RUN grep testuser /etc/passwd
 ---> Using cache
 ---> db72fff0b965
Step 5 : RUN grep root /etc/passwd
 ---> Running in ebff78df7a9a
root:x:0:0:root:/root:/bin/bash
 ---> ead0ff704a59
Removing intermediate container ebff78df7a9a
Step 6 : RUN chown -R testuser:testuser /var/local/testrunner/logs
 ---> Running in c925f67b2ab4
 ---> 253132be935e
Removing intermediate container c925f67b2ab4
Step 7 : RUN ls -ld /var/local/testrunner/logs
 ---> Running in 978bc66aa47e
drwxr-xr-x 2 root staff 4096 Oct  1 15:15 /var/local/testrunner/logs

Docker version 1.2.0, construire fa7b24f

L'hôte exécute Ubuntu 12.04, mais avec un noyau 3.13.0-36-générique.

58
user100464

Répondant à ma propre question: c'est un volume. Si vous supprimez l'instruction VOLUME, le chown prend effet.

De plus, si vous déclarez le volume after exécutant chown, les paramètres chown restent en vigueur.

100
user100464

Ce blog (http://container42.com/2014/11/03/docker-indepth-volumes/ ) explique ce comportement en détail.

Chaque instruction du fichier Docker crée un nouveau conteneur. L'instruction apporte des modifications à ce conteneur et devient un nouveau calque. Les modifications apportées à "/ var/local/testrunner/logs" avant l'instruction VOLUME ont été apportées au système de fichiers conteneur actuel. Cependant, après l'instruction VOLUME, le répertoire "/ var/local/testrunner/logs" est le répertoire monté. Les modifications apportées à ce répertoire après l'instruction VOLUME s'appliqueront au répertoire monté et non au système de fichiers du conteneur.

7
hobgoblin

D'après mon expérience, chown ne fonctionne pas lors du montage à la racine (VOLUME /test). Utilisez un emplacement non root (VOLUME /var/test).

0
Mike