2014-10-01 29 views
37

My Dockerfile crea una directory, la chown e quindi elenca la directory in seguito. La directory è ancora di proprietà di root. Perché?perché chown non funziona in Dockerfile?

Ecco la 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 

Ecco l'output di "costruire finestra mobile":

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 versione 1.2.0, costruire fa7b24f

L'host gestisce Ubuntu 12.04 , ma con un kernel generico 3.13.0-36.

risposta

71

Rispondere alla mia domanda: è dichiarato essere un volume. Se si estrae l'istruzione VOLUME, il chown ha effetto.

Inoltre, se si dichiara il volume dopo il chown in esecuzione, le impostazioni di chown rimangono attive.

+12

"Se si dichiara il volume dopo aver eseguito chown, le impostazioni di chown rimangono in vigore" Questo ha appena risposto a qualcosa che mi ha bloccato per due giorni. Grazie! – CashIsClay

+1

@ user100464 Mi chiedo se ci sia una spiegazione ragionevole per questo comportamento piuttosto strano. Sembra che l'hai capito solo per tentativi ed errori. O questo è documentato da qualche parte? –

+1

Rispondendo a me stesso: la spiegazione qui aveva senso per me http://container-solutions.com/2014/12/understanding-volumes-docker/ –

3

Questo blog http://container42.com/2014/11/03/docker-indepth-volumes/ spiega questo comportamento in dettaglio.

Ogni istruzione nel file Docker crea un nuovo contenitore. L'istruzione apporta alcune modifiche a questo contenitore e diventa un nuovo livello. Le modifiche apportate a "/ var/local/testrunner/logs" prima dell'istruzione VOLUME sono state apportate al reale filesystem del contenitore. Tuttavia, dopo l'istruzione VOLUME, la directory "/ var/local/testrunner/logs" è la directory montata. Le modifiche apportate a questa directory dopo l'istruzione VOLUME si applicano alla directory montata e non al reale filesystem del contenitore.