ЯдроКодаподготовка к экзаменам
Учебная платформа

Загружаем материалы

Подготавливаем материалы и навигацию по разделу.

Dockerfile VOLUME: объявление пути, runtime mount и заполнение пустого тома

Автор: · Обновлено

Инструкция VOLUME в Dockerfile объявляет путь для данных контейнера. Она не выбирает каталог вашего компьютера, не задаёт удобное имя будущего тома и не делает резервную копию. Подключение конкретного хранилища обычно описывают при запуске через --mount, -v или Compose.

Образ с начальным файлом

Создайте Dockerfile в отдельной папке:

FROM alpine:3.22
RUN mkdir -p /data && printf '%s\n' seed > /data/note.txt
VOLUME ["/data"]
CMD ["cat", "/data/note.txt"]
docker build -t dk-volume-image:1 .
docker image inspect dk-volume-image:1 --format '{{json .Config.Volumes}}'
docker run --name dk-volume-auto dk-volume-image:1
docker inspect dk-volume-auto --format '{{json .Mounts}}'

Первый inspect показывает объявленный /data. Run выводит seed, второй inspect — реально созданный mount. Поскольку явное хранилище не указано, Docker создаёт анонимный том. Его сгенерированное имя не стоит путать с именем контейнера. Инструкция VOLUME.

Контейнер завершён после cat. Для уборки только этого эксперимента выполните docker rm -v dk-volume-auto: флаг -v удалит связанный анонимный том. Обычный rm оставил бы его. При docker run --rm анонимный том удаляется вместе с контейнером; именованные тома имеют другой жизненный цикл.

Явное имя и копирование начальных данных

docker volume create dk-volume-seed
docker run --rm --mount type=volume,src=dk-volume-seed,dst=/data dk-volume-image:1
docker run --rm --mount type=volume,src=dk-volume-seed,dst=/data alpine:3.22 cat /data/note.txt

Обе команды выводят seed. Когда пустой том монтируется поверх каталога с файлами образа, Docker по умолчанию копирует эти файлы в том. Это начальное заполнение (copy-up), а не постоянная синхронизация. Поведение пустого volume.

Теперь измените данные:

docker run --rm --mount type=volume,src=dk-volume-seed,dst=/data alpine:3.22 sh -c 'echo user-data > /data/note.txt'
docker run --rm --mount type=volume,src=dk-volume-seed,dst=/data dk-volume-image:1

Получится user-data. Непустой том закрывает содержимое /data в образе; запуск нового контейнера не перезаписывает пользовательские файлы значением seed. По этой же причине обновление образа базы не является автоматической миграцией данных.

Отключение copy-up

Для отдельного пустого тома:

docker volume create dk-volume-empty
docker run --rm --mount type=volume,src=dk-volume-empty,dst=/data,volume-nocopy dk-volume-image:1 sh -c 'test ! -e /data/note.txt && echo empty'

Ожидается empty: volume-nocopy запретил начальное заполнение. Переиспользовать уже заполненный том для этой проверки нельзя — флаг не удаляет ранее созданные файлы. Именованный том можно подключить к любому подходящему пути даже без VOLUME в Dockerfile; инструкция не является обязательным условием работы --mount.

Почему bind mount ведёт себя иначе

При bind mount в /data показывается конкретный каталог хоста. Файлы образа под этой точкой закрываются; пустой каталог компьютера не заполняется автоматически по правилам volume copy-up. Поэтому «после подключения папки пропал файл из образа» часто объясняется подменой видимого каталога, а не удалением файла. Создайте новый контейнер без этого mount, чтобы сравнить содержимое. Семантика bind mounts.

VOLUME не подходит для объявления «монтируй C:\data с моего ноутбука»: образ должен оставаться независимым от пути конкретной машины. Настройку источника хранения оставляют окружению запуска.

Практика и завершение

Измените seed в Dockerfile на seed-v2, соберите тег :2 и запустите с существующим dk-volume-seed. Предскажите результат: сохранится user-data. Затем используйте новый пустой именованный том и увидите seed-v2. Это важная проверка перед работой с базами данных.

После эксперимента удалите только учебные тома, данные которых больше не нужны: docker volume rm dk-volume-seed dk-volume-empty и отдельно новый том, если создавали его. Не заменяйте точную уборку командой удаления всех volumes. Следующие уроки рассматривают выбор volumes/bind mounts, относительные пути Compose, права доступа и резервное копирование.

Источники