#Как выглядит неисправность
Контейнер не видит каталог, подключённый с хоста: путь пустой, приложение получает ENOENT или Permission denied. Bind mount имеет два пути — source на хосте и target внутри контейнера, их нельзя путать.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Монтируется не тот каталогОтносительный путь вычислен из другой директории Compose | В Mounts Source не совпадает с нужной папкой | Указать абсолютный путь и проверить compose config |
| Нет прав у процесса в контейнереПапка существует, но uid/gid приложения не имеют доступа | permission denied при чтении конкретного файла | Согласовать владельца и доступ только к нужной папке |
#Пошаговое устранение
- 1. Проверьте реальный путь хостаВ терминале Linux-хоста выполните pwd и ls -ld /полный/путь. На Windows/macOS откройте папку через проводник и убедитесь, что Docker Desktop имеет разрешение на её совместное использование. Не полагайтесь на путь внутри контейнера.
- Linux-хост, только проверка; путь заменить своимLinux · Терминал (Bash)КомандаLinux-хост, только проверка; путь заменить своим.
pwdls -ld /полный/путь
- 2. Проверьте итоговую конфигурациюВ папке Compose выполните docker compose config. Найдите volumes конкретного сервиса и проверьте source/target и тип bind. Не отправляйте полный вывод публично, если в нём есть закрытые переменные.Linux · Терминал (Bash)КомандаЧитает и раскрывает разрешённую конфигурацию; может содержать секреты.
docker compose config
- 3. Узнайте фактически подключённые каталогиВыполните docker inspect --format ... ИМЯ. В Mounts источник должен указывать на нужную существующую директорию хоста, а Destination — на место чтения внутри контейнера.Linux · Терминал (Bash)КомандаПроверяет фактические монтирования.
docker inspect --format '{{json .Mounts}}' ИМЯ
- 4. Проверьте видимость файлов, не меняя ихЕсли Linux-образ содержит ls, запустите docker exec ИМЯ ls -la /путь/в/контейнере. Для distroless используйте специально подготовленный тестовый контейнер/образ. Если файл есть, но доступ отказан, проверьте UID/GID процесса и права на каждый родительский каталог.Linux · Терминал (Bash)КомандаТолько чтение; команда ls может отсутствовать в образе.
docker exec ИМЯ ls -la /путь/в/контейнере
- 5. Исправьте только нужный путьИзмените bind mount в compose.yaml: source — существующий каталог на хосте, target — точный путь приложения. Для только чтения используйте read_only: true в длинной форме mounts. Проверьте docker compose config --quiet.
- 6. Пересоздайте тестовый сервис и проверьтеПосле сохранения текущей конфигурации примените docker compose up -d --force-recreate ИМЯ_СЕРВИСА к тестовому сервису. Повторите проверку нужного файла и запрос приложения; если permission denied — согласуйте минимальные права с администратором, а не отключайте защиту.Linux · Терминал (Bash)С осторожностьюМеняет контейнер, возможен краткий простой; использовать на согласованной тестовой копии.
docker compose up -d --force-recreate ИМЯ_СЕРВИСАКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
Контейнер читает ровно нужные файлы, путь в docker inspect соответствует ожидаемому, а права других каталогов хоста не ослаблены.
#Если проблема осталась
Не повторяйте опасные действия на рабочем окружении. Сравните первоначальный симптом с новым состоянием, сохраните обезличенные сообщения и версии компонентов, проверьте резервную копию; перед изменением общей истории Git или данных/сети Docker обратитесь к ответственному администратору проекта.