Docker запускает -v или Dockerfile VOLUME имеет приоритет?

Dockerfile

FROM nginx:1.7

# Deliberately declaring VOLUME before RUN
VOLUME /var/tmp

RUN  touch /var/tmp/test.txt

наблюдение

Теперь я верю, что понимаю последствия объявления VOLUME заявление перед созданием test.txt - громкость /var/tmp во время выполнения будет основан на промежуточном контейнере до test.txt файл создан, поэтому он будет пустым (надеюсь, это наблюдение верно)

Так как и ожидалось следующее docker run не показывает test.txt:

docker run kz/test-volume:0.1

Но затем я попытался предоставить объем во время выполнения, как показано ниже:

docker run -v /var/tmp kz/test-volume:0.1

Вопрос

Результат был таким же. Так что это значит? делает -v /var/tmp в Docker запустить команду map to empty /var/tmp Дир выставлен VOLUME команда в Dockerfile, а не /var/tmp каталог с test.txt на последнем изображении?

Чувствуя себя немного смущенным.

1 ответ

Решение

Там нет изображения, которое содержит /var/tmp/test.txt, Эффект объявления объема перед созданием файла заключается в том, что RUN Инструкция выполняется во временном контейнере, который имеет свой собственный объем. Тома обходят файловую систему Union, поэтому, когда сборка сохраняет этот промежуточный контейнер, содержимое тома не сохраняется, поэтому оно не сохраняется в слое изображения.

Каждый контейнер, который вы создаете из этого изображения, будет иметь свой собственный объем, -v Параметр не меняет этого, если вы не используете его для сопоставления тома с путем к хосту.

Используя ваш Dockerfile, вы можете убедиться в этом, проверив два контейнера. Первый без -v опция:

> docker run -d temp                                                                                              
c3c4f7de411f166b3a67397ff1221552fe5b94c46bc100725a50a57231da427b                                                  

> docker inspect -f '{{ .Mounts }}' c3c                                                                           
[
    {67267d2eeb57373f76a9dd50c25f744b7d99d0a75647bf06aa0d17b70807cf71/var/lib/docker/volumes/67267d2eeb57373f76a9dd50c25f744b7d99d0a75647bf06aa0d17b70807cf71/_data /var/cache/nginx local  true }
    {91490ea73e3a9d42df9f00e32a91fe571d2143f54248071959765d5d55c23d46/var/lib/docker/volumes/91490ea73e3a9d42df9f00e32a91fe571d2143f54248071959765d5d55c23d46/_data /var/tmp local  true }
]  

Здесь есть два тома, смонтированные из /var/lib/docker на хосте. Один из nginx базовое изображение, и один из вашего изображения. С явным -v:

> docker run -d -v /var/tmp temp                                                                                  
6fa1a8713b2d6638675a3d048669943419bc7a3924ed98371771100bcfde3954 

> docker inspect -f '{{ .Mounts }}' 6fa                                                                           
[
    {9adf6954ed3e826f23a914cbbd768753e6dec1f176eed10e03c2d5503287d101/var/lib/docker/volumes/9adf6954ed3e826f23a914cbbd768753e6dec1f176eed10e03c2d5503287d101/_data /var/cache/nginx local  true } 
    {7dd8be71ce88017ffbeef249837bdd1c96c071b802a2f43b18fd406983e1076a/var/lib/docker/volumes/7dd8be71ce88017ffbeef249837bdd1c96c071b802a2f43b18fd406983e1076a/_data /var/tmp local  true }
]  

Тот же результат, но разные пути к хостам, потому что у каждого контейнера свой том.

Другие вопросы по тегам