Директива VOLUME
не «экспортирует содержимое» каталога. Там написано "создать том и смонтировать его по этому пути". Поэтому, когда вы пишете:
COPY --from=builder --chown=www-data:www-data /var/www /var/www
VOLUME /var/www
Вы говорите:
- Сначала скопируйте группу файлов в
/var/www
- Затем смонтируйте пустой том on
/var/www
Монтирование тома происходит как во время сборки (влияет на любые последующие операторы RUN
), так и во время выполнения (влияет на среду, которую вы видите с помощью docker run
).
Если вы удалите директиву VOLUME
из Dockerfile
, а затем запустите свое изображение следующим образом:
docker run -v /var/www yourimage ...
Тогда Docker создаст новый том и скопирует в него содержимое /var/www
перед монтированием.
Аналогично, если у вас есть именованный том, вы можете сделать то же самое:
docker run -v myvolume:/var/www yourimage ...
Docker будет выполнять эту автоматическую c операцию копирования только в том случае, если Том, который вы монтируете, пуст. Если том имеет существующее содержимое, он будет просто подключен по указанному пути, скрывая все, что находится под этой точкой монтирования.
Например ...
У меня есть изображение с именем kos
имеет несколько файлов в /var/www
. Мы можем увидеть их, запустив ls /var/www
:
bash-5.0$ docker run kos ls /var/www
index.html
testing.jpg
Если я смонтирую анонимный том на /var/www
с docker run -v
, мы увидим, что он заполняется содержимым из базового /var/www
directory:
bash-5.0$ docker run -v /var/www kos ls /var/www
index.html
testing.jpg
Мы видим то же поведение, если создаем именованный том и монтируем его на /var/www
:
bash-5.0$ docker volume create kos_testing
kos_testing
bash-5.0$ docker run -v kos_testing:/var/www kos ls /var/www
index.html
testing.jpg
bash-5.0$