Можно ли использовать один общий именованный том с несколькими путями?
Я хочу избежать повторения (шаблон DRY) и избежать создания множества именованных томов для разных путей, которые должны быть централизованы из-за бизнес-требований (политики резервного копирования и т. д.).
Я создал следующий именованный том vol-web
на основе NFS, чтобы поделиться им со многими работниками моего роевого кластера. Но его можно воспроизвести локально. Просто представьте, что том указывает на каталог на вашем хосте.
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=10.0.0.2,rw \
--opt device=:/var/web \
vol-web
Файл ниже предназначен только для тестовых целей, но у меня есть много файлов компоновки, множество сервисов, которые будут использовать это решение на практике.
version: '3.8'
services:
database:
image: postgres:16.2
container_name: mydb
restart: always
environment:
- POSTGRES_USER=myuser
- POSTGRES_PASSWORD=mypassword
volumes:
- vol-web/pgdata:/var/lib/postgresql/data
- vol-web/config/pg/postgres-init.sh:/docker-entrypoint-initdb.d/postgres-init.sh
ports:
- "5432:5432"
nginx:
image: nginx:1.25.4
container_name: my-nginx
ports:
- "80:80"
- "443:443"
volumes:
- vol-web/config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- vol-web/certbot/conf:/etc/letsencrypt
volumes:
vol-web:
На самом деле я получаю следующее сообщение об ошибке:
service "database" refers to undefined volume vol-web/pgdata: invalid compose project
Я открыт для новых решений в этом случае.
Поддержка монтирования подпутей тома доступна только в Docker 26.0.0 (выпуск от 20 марта 2024 г.) и более поздних версиях (запрос на включение объединен в январе). Это добавляет опцию subpath
к монтированию томов.
Используя docker run
, мы можем смонтировать подкаталог pgdata
тома vol-web
на /data
следующим образом:
docker run -it --rm \
--mount type=volume,source=vol-web,target=/data,volume-subpath=pgdata \
alpine sh
Поддержка этой функции в docker compose
была добавлена всего несколько дней назад и доступна только в плагине compose
версии 2.26.0 и новее; В настоящее время это недоступно в версии Docker.
До вышеперечисленных версий невозможно было смонтировать подпуть тома.
Не имеет отношения к вашему вопросу, но важно: когда вы создаете такой том:
docker volume create --driver local \
--opt type=nfs \
--opt o=addr=10.0.0.2,rw \
--opt device=:/var/web \
vol-web
А затем используйте такую запись тома в своем файле создания:
volumes:
vol-web:
Они имеют в виду не один и тот же том. Имена томов, сети и контейнеров в вашем файле создания начинаются с имени вашего проекта создания (обычно это имя каталога, содержащего файл создания, но его также можно задать явно). Если вы хотите, чтобы ваш составной файл ссылался на существующий внешний том, вам необходимо установить его как external
:
volumes:
vol-web:
external: true
Да, это ожидаемо. Как я сказал в этом ответе, поддержка этого еще не реализована в версии плагина Compose, но похоже, что она, вероятно, будет доступна в следующей версии.
Спасибо, но я не смог использовать новую функцию с помощью файлов компоновки. Я создал задачу для команды докеров: github.com/moby/moby/issues/47687