Как настроить Docker, чтобы он монтировал директорию за пределами io.containerd.snapshotter.v1.overlayfs?

Пишу приложение, которое должно создавать файл с настройками по умолчанию myapp.cfg и сохранять его в /var/lib/myapp/ на хосте. В compose-файле я указываю этот том так: <br/> <pre><code class="yaml">services:
  • 23 марта 2026 г. 20:00
Ответы на вопрос 3
Кратко: нужно не создавать «обычный» контейнерный том (который 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, помогу поправить конкретно.
<code>docker inspect</code> без секции Mounts значит бинд-маунт вообще не подцепился, тут даже не в приложении дело. Проверь <code>docker compose config</code> , может не тот compose-файл подхватывается. Ну и ещё: <code>snapshots/119/fs/myapp.cfg</code> в overlayfs это <code>/myapp.cfg</code> в корне контейнера, не <code>/var/lib/myapp/myapp.cfg</code> , так что приложение пишет конфиг не туда. Сначала разберись с маунтом, потом с путём.
<pre><code>services:
  myapp:
    image: java.myapp:arm64-1.0.2
    ports:
      - '47500:47500'
    volumes:
      - ./:/var/lib/myapp:rw
    pull_policy: never</code></pre> <br/> <br/> ну или я не совсем понял вопроса
Похожие вопросы