Что было. Контейнер запускается с томом /data/docker/config/app:/config. Файлы, которые приложение создаёт в /config, на хосте в /data/docker/config/app не появляются. Если написать относительный путь ./data/..., каталог создаётся и заполняется, но в домашнем каталоге пользователя.
Причина. При установке системы был отмечен Docker из snap, позже администратор поставил docker.io из apt. Два движка с разными демонами, разными сокетами и разной изоляцией файловой системы: snap-версия работает в ограниченном пространстве и видит хост иначе, чем классический пакет, поэтому абсолютные пути хоста для неё «не те», а команда docker в терминале попадала то в один, то в другой. Автор удалил обе установки и поставил одну заново; проблема исчезла за полчаса. Подтверждено.
Как проверить, что Docker один.
which -a docker # несколько путей = несколько установок
snap list | grep -i docker
dpkg -l | grep -E 'docker|containerd'
docker context ls # активный контекст и сокет
systemctl status docker snap.docker.dockerd 2>/dev/null
ls -l /var/run/docker.sock /run/snap.docker/docker.sock 2>/dev/null
Рекомендация для серверов. Ставить Docker Engine из официального репозитория проекта (или docker.io из Ubuntu, если версия устраивает), но не из snap: snap-версия ограничена в доступе к файловой системе (/home, съёмные носители по умолчанию недоступны без подключения интерфейсов), отстаёт по версиям и хуже дружит с системными службами. Удаление snap-версии: snap remove docker (данные контейнеров в ней теряются, вынести заранее). Убедиться, что осталась одна: docker version показывает один сервер.
Другие причины «том не там».
- Docker Desktop или удалённый контекст: контейнеры работают в другой машине, абсолютные пути указывают на её файловую систему;
docker context use default. - Rootless Docker: пути и владельцы файлов внутри пользовательского пространства имён, файлы на хосте принадлежат «сдвинутым» uid.
- Опечатка в имени:
-v /data/…на одной машине и/datb/…на другой;docker inspect <контейнер> --format '{{json .Mounts}}'показывает фактические точки. - Относительный путь в
docker runне поддерживается (нужен$(pwd)/dir), в compose поддерживается относительно файла compose.
Проверка монтирования. docker run --rm -v /data/test:/t alpine sh -c 'echo ok > /t/file' и cat /data/test/file на хосте: если файла нет, дело в движке, а не в приложении.
Установка описана в документации Docker.