Чтобы безопасно изменить bind mount в Compose на macOS, сначала определите существующую папку на хосте и путь внутри контейнера, который она обслуживает. Скопируйте файлы в новую папку на Mac перед редактированием Compose, затем проверьте итоговый путь монтирования и пересоздайте затронутый сервис. Bind mount указывает на путь хоста; изменение этого пути не перемещает и не удаляет исходные файлы. В документации по bind mount Docker также поясняется, что монтирование может скрывать файлы, уже присутствующие в целевой директории контейнера.
Узнайте, какими файлами управляет монтирование
Bind mount в Compose связывает путь на вашем Mac с путем внутри контейнера. Например, ./data:/var/lib/example делает каталог data, находящийся рядом с файлом Compose, доступным внутри контейнера по пути /var/lib/example. Записи, производимые контейнером в это монтирование, могут изменять файлы на Mac, поскольку bind mounts по умолчанию доступны для чтения и записи. Папка на Mac — это данные, которые вам необходимо сохранить; целевой путь в контейнере — это место, где их ожидает увидеть приложение.
Это отличается от именованного тома (named volume), такого как db-data:/var/lib/example. Именованный том хранится и управляется Docker, тогда как bind mount использует каталог хоста. Замена одного на другое является миграцией хранилища, а не просто редактированием пути. Не предполагайте, что пересоздание контейнера скопирует файлы между ними. В документации по хранилищам Docker описывается это различие.
Скопируйте существующие файлы в новую папку на Mac
Перед изменением файла Compose остановите сервис, если он может выполнять запись данных. В терминале выполните команду docker compose stop app, заменив app на имя сервиса Compose. Это снизит вероятность расхождения содержимого старой и новой папок во время копирования. Проверьте файл Compose и любые файлы переопределений, чтобы точно подтвердить текущие исходные и целевые пути; не пытайтесь угадать их только по видимой директории контейнера.
Например, если текущим источником является ~/Projects/Old App/data, а новым источником должен стать ~/Projects/New App/data, создайте целевую директорию и скопируйте содержимое с помощью стандартной команды macOS rsync:
mkdir -p "$HOME/Projects/New App/data"
rsync -a "$HOME/Projects/Old App/data/" "$HOME/Projects/New App/data/"
Слеши на конце означают «скопировать содержимое этого каталога». Кавычки защищают пробелы в этих путях-примерах от zsh — командной оболочки по умолчанию в macOS. Эта команда объединяет файлы в месте назначения и не удаляет файлы, присутствующие только в целевой папке. Проверьте целевую папку перед тем, как продолжить. Если данные важны, сделайте также независимую резервную копию; обычная копия не заменяет бэкап.
Обновите bind mount и защититесь от опечаток
Отдавайте предпочтение длинному синтаксису Compose для монтирования каталогов, если вы хотите, чтобы отсутствие исходного пути останавливало запуск, а не приводило к автоматическому созданию пустой папки:
services:
app:
volumes:
- type: bind
source: ./data
target: /var/lib/example
bind:
create_host_path: false
Здесь ./data разрешается относительно родительского каталога файла Compose для локальной среды выполнения Compose. Измените его на нужный относительный или абсолютный путь Mac, но оставьте target неизменным, если приложение должно продолжать использовать /var/lib/example. Короткий синтаксис Compose создает каталог хоста, если исходный путь отсутствует; длинный синтаксис с create_host_path: false предотвращает такое поведение. См. справочник по сервисам Compose.
Если вы выбираете абсолютный путь с пробелами, заключите строку YAML в кавычки, например source: "/Users/sam/Projects/New App/data". Замените sam на фактическое имя домашней директории вашей учетной записи Mac. Оставляйте путь источника в YAML как литеральный путь; правила экранирования оболочки применяются к командам терминала, а не к значениям в YAML.
Проверьте разрешенный путь, затем пересоздайте сервис
Из каталога, содержащего файл Compose, проверьте конфигурацию, которую будет использовать Compose:
docker compose config
Убедитесь, что источник привязки сервиса app указывает на новую папку, а его целевой путь — по-прежнему /var/lib/example. Если вы используете несколько файлов Compose, помните, что пути вычисляются на основе первого указанного файла; это поведение описано в справочнике по Compose CLI. Если разрешенный источник оказался неожиданным, остановитесь и исправьте файл перед запуском контейнеров.
Пересоздайте сервис, чтобы запущенный контейнер получил обновленное монтирование:
docker compose up -d --force-recreate app
docker compose ps app
Документация Compose указывает, что up пересоздает контейнеры при изменении конфигурации, а --force-recreate указывает на это явно. Убедитесь, что сервис запущен, затем проверьте наличие ожидаемых файлов или данных приложения, прежде чем удалять или переименовывать старую папку. Старый каталог останется на вашем Mac, пока вы не удалите его вручную. Сохраняйте его до тех пор, пока не убедитесь, что новый источник корректен и приложение работает должным образом.
Если монтирование завершается сбоем в Docker Desktop для Mac
Docker Desktop запускает контейнеры в виртуальной машине Linux и выступает посредником при доступе к файлам Mac. По умолчанию список общих каталогов включает /Users, /Volumes, /private, /tmp и /var/folders; источник вне доступных общих папок, возможно, потребуется добавить в разделе Docker Desktop Settings > Resources > File sharing. В документации по настройкам Desktop Docker описывается этот параметр и отмечается, что права доступа к файлам по-прежнему имеют значение.
Неудачное монтирование должно стать поводом для проверки пути и параметров общего доступа, а не для удаления старой копии. Если новый каталог пуст, проверьте разрешенный source, попали ли файлы при копировании на нужный уровень каталогов и имеет ли Docker Desktop доступ к этой папке на Mac. Не используйте команду docker compose down -v для исправления проблем с bind mount: она не требуется для изменения источника привязки и может удалить именованные тома, используемые проектом.
Безопасный финал прост: убедитесь, что новая папка на Mac содержит необходимые файлы, подтвердите, что Compose правильно определяет этот путь и целевой каталог контейнера, а затем протестируйте пересозданный сервис перед удалением исходной копии.
Источники
Bind mounts — Docker Docs
Define services in Docker Compose — Docker Docs
docker compose — Docker Docs
Change your Docker Desktop settings — Docker Docs