2014-12-14 4 views
8

Я новичок в Докер и попытаться построить изображение с простым Dockerfile:Строительство Dockerfile терпит неудачу при касании файла после MKDIR

FROM jenkins 
USER root 
RUN mkdir -pv /home/a/b 
RUN touch /home/a/b/test.txt 
RUN mkdir -pv /var/jenkins_home/a/b 
RUN touch /var/jenkins_home/a/b/test.txt 
USER jenkins 

Когда я строем, он терпит неудачу с следующим выводом:

Step 0 : FROM jenkins 
Step 1 : USER root 
Step 2 : RUN mkdir -pv /home/a/b 
    mkdir: created directory '/home/a' 
    mkdir: created directory '/home/a/b' 
Step 3 : RUN touch /home/a/b/test.txt 
Step 4 : RUN mkdir -pv /var/jenkins_home/a/b 
    mkdir: created directory '/var/jenkins_home/a' 
    mkdir: created directory '/var/jenkins_home/a/b' 
Step 5 : RUN touch /var/jenkins_home/a/b/test.txt 
    touch: cannot touch '/var/jenkins_home/a/b/test.txt': No such file or directory 

Может ли кто-нибудь сказать мне, что мне здесь не хватает? Почему первый mkdir & работает с сенсорной комбинацией, а второй - нет?

ответ

6

Глядя на https://registry.hub.docker.com/u/library/jenkins/, кажется, что/var/jenkins_home является томом. Вы можете только создавать файлы там в то время как контейнер работает, предположительно, с отображением объема как

docker run ... -v /your/jenkins/home:/var/jenkins_home ... 

Процесс сборки докер ничего не знает об общих объемах.

+0

Я думаю, что для создания изображения существует промежуточный контейнер, поэтому вы можете более подробно объяснить свой ответ? – harryz

+0

Отредактировано для большей ясности. – seanmcl

5

Это в настоящее время исследуется в docker/docker/issues/3639 и обобщены в this comment:

Хорошо, я сделал небольшое исследование и , кажется, что объем не является изменяемым между инструкцией Dockerfile.
Здесь еще меньше Dockerfile для тестирования:

FROM busybox 

RUN mkdir /tmp/volume 
RUN echo "hello" > /tmp/volume/hello 
VOLUME ["/tmp/volume/"] 
RUN [[ -f /tmp/volume/hello ]] 
RUN rm /tmp/volume/hello 
RUN [[ ! -e /tmp/volume/hello ]] 

На каждой инструкции мы создаем новый объем и скопировать содержимое из исходного объема.

+1

Это гораздо лучший ответ :) – harryz