Кратко: нужно не создавать «обычный» контейнерный том (который Docker/containerd хранит в своих snapshot/overlay-деревьях), а смонтировать конкретную директорию хоста — либо напрямую (bind‑mount), либо создать локальный том с опцией bind. Тогда файлы будут писаться прямо в /var/lib/myapp на хосте.
Примеры.
1) Прямой bind‑маунт (проще всего)
В service указываете абсолютный путь хоста:<host>:<container>
Пример docker‑compose.yml:
services:
myapp:
image: myapp:latest
volumes:
- /var/lib/myapp:/var/lib/myapp
Создайте папку на хосте и поставьте права:
sudo mkdir -p /var/lib/myapp
sudo chown <uid>:<gid> /var/lib/myapp # если контейнер пишет от определённого пользователя
или временно sudo chmod 0777 /var/lib/myapp
SELinux: если на хосте включён SELinux, добавьте :z или :Z:
- /var/lib/myapp:/var/lib/myapp:z
2) Именованный том, который на самом деле bind'ится к хостовой папке
Если хотите использовать раздел volumes: внизу файла:
volumes:
myapp-data:
driver: local
driver_opts:
type: none
o: bind
device: /var/lib/myapp
services:
myapp:
image: myapp:latest
volumes:
- myapp-data:/var/lib/myapp
Это создаёт Docker‑том, но его данные будут физически в /var/lib/myapp на хосте.
Как проверить, что действительно маунт к хосту:
- docker inspect <container> --format '{{json .Mounts}}'
- mount | grep myapp или посмотрев /proc/<pid>/mounts контейнера
Пояснение, почему вы видите io.containerd.snapshotter.v1.overlayfs:
это snapshot/overlay, который использует containerd для слоёв образа/контейнера. Если вы не делаете bind к конкретной директории хоста, Docker может хранить данные в своих внутренних путях (overlay/volumes). Чтобы файлы оказались в /var/lib/myapp на хосте — используйте bind (варианты выше).
Учтите:
- На Docker Desktop (Mac/Windows) «хост» — это виртуальная машина, нужно разрешить общий доступ к папке в настройках Docker Desktop.
- Для rootless Docker пути и права могут отличаться — убедитесь, что процесс контейнера имеет доступ к хостовой папке.
Если покажете ваш кусок docker‑compose.yml, помогу поправить конкретно.