Один общий именованный том с несколькими путями

Можно ли использовать один общий именованный том с несколькими путями?

Я хочу избежать повторения (шаблон 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

Я открыт для новых решений в этом случае.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поддержка монтирования подпутей тома доступна только в 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

Спасибо, но я не смог использовать новую функцию с помощью файлов компоновки. Я создал задачу для команды докеров: github.com/moby/moby/issues/47687

joccafi 06.04.2024 17:58

Да, это ожидаемо. Как я сказал в этом ответе, поддержка этого еще не реализована в версии плагина Compose, но похоже, что она, вероятно, будет доступна в следующей версии.

larsks 06.04.2024 23:13

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