Поиск по сайту:

Как смонтировать том Docker, исключая подкаталог


Docker Volumes обеспечивают постоянное хранилище для ваших контейнеров. Данные, хранящиеся в томах, хранятся независимо от контейнеров, поэтому их можно восстановить после перезапуска и замены. Тома поддерживают одновременное использование нескольких контейнеров, облегчая ситуации совместного использования данных.

При монтировании тома Docker его содержимое становится доступным по определенному пути к каталогу внутри целевого контейнера. Все в дереве файловой системы тома становится доступным. Это может создать проблему, если вы хотите исключить определенные подкаталоги в данных тома. В этой статье вы познакомитесь с простой техникой монтирования томов, избегая определенных путей.

Зачем вам это делать?

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

Тома также могут быть заполнены с помощью монтирования с привязкой к хосту. Они напрямую сопоставляют каталог на вашем компьютере с путем внутри вашего контейнера. Изменения, сделанные в каталоге хоста, будут автоматически отражены в контейнере.

Привязные монтирования обычно используются для ускорения разработки приложений. Вы можете изменять исходный код и наблюдать за своими изменениями, не перестраивая образ Docker. Рабочие каталоги проекта часто содержат некоторые папки, которые вы не хотите зеркалировать, например, node_modules и vendor. Они могут уже существовать в вашем контейнере, заполненном во время создания образа. построить шаги. Исключение локальных папок из монтирования позволяет надежно протестировать код с использованием зависимостей, предоставленных вашим образом.

Как исключить подкаталоги из монтирования тома Docker

Подкаталоги можно исключить из монтирования тома с помощью простой техники: создайте другое монтирование по пути, который вы хотите игнорировать. Если вы монтируете ~/app в /opt/app в своем контейнере, вы можете исключить каталог ~/app/node_modules, смонтировав второй пустой том в /opt/app/node_modules:

$ docker run --name app \
    -v ~/app:/opt/app \
    -v /opt/app/node_modules \
    app-image:latest

Этот контейнер начнется с содержимого каталога ~/app вашего хоста, доступного по адресу /opt/app. Однако /opt/app/node_modules будет содержать исходный контент, предоставленный базовым образом, а не каталог ~/app/node_modules вашего хоста.

Это работает, потому что Docker автоматически заполняет вновь созданные пустые тома существующим содержимым пути назначения, к которому они подключены. Если вы запустите npm install как часть вашего Dockerfile, /opt/app/node_modules уже будет содержать все ваши зависимости. Первое монтирование тома связывает ваш хост-каталог с контейнером, а второе заменяет его пустым томом в /opt/app/node_modules. Затем он заполняется файлами и папками, включенными в образ.

Порядок монтирования вашего тома важен — монтирование подкаталога должно применяться после менее специфичной родительской привязки. В противном случае содержимое ~/app, включая его версию node_modules, в конечном итоге переопределит пустой том, предназначенный для создания исключения.

Исключение файлов

Вы можете использовать аналогичную технику для эффективного исключения отдельных файлов. Подключение /dev/null вашего хоста к пути к файлу очистит его, как если бы у него не было содержимого.

$ docker run --name app \
    -v /dev/null:/opt/app/config.yaml \
    app-image:latest

Это работает только для исключения файлов — /dev/null не будет сопоставляться с путями к каталогам. Этот метод не работает, чтобы пропустить файл, сохраняя при этом исходную версию из вашего базового образа. Он сопоставит /dev/null с путем, заменив любой существующий там файл.

Использование Docker Compose

Оба эти метода работают и с Docker Compose. Настройте раздел volumes определения вашего сервиса, чтобы включить обычное монтирование привязки и соответствующее переопределение пустого тома.

services:
  app:
    image: app-image:latest
    build: .
    volumes:
      - ~/app:/opt/app
      - /dev/null:/opt/app/config.yaml      # Exclude file
      - /opt/app/node_modules               # Exclude directory

Запуск docker-compose up будет иметь тот же эффект, что и простой пример docker run, показанный выше.

Краткое содержание

При монтировании тома Docker все в пути назначения контейнера заменяется содержимым связанного каталога хоста. В некоторых ситуациях вы можете настроить это поведение, исключив монтирование определенных путей хоста.

В этой статье вы видели, как монтирование пустого тома в подкаталог внутри контейнера отменит первую привязку. Содержимое подкаталога контейнера вернется к исходному содержимому, предоставленному вашим изображением. Разновидность этого метода также можно использовать для файлов, хотя вместо этого путь будет перезаписан /dev/null.




Все права защищены. © Linux-Console.net • 2019-2024