overlayfs внутри контейнера докеров

Можно ли смонтировать оверлейный fs внутри (привилегированного) контейнера докеров? По крайней мере, мой интуитивный подход, который отлично работает вне контейнера, терпит неудачу:

      > mkdir /tmp/{up,low,work,merged}
> mount -t overlay overlay -o lowerdir=/tmp/low/,upperdir=/tmp/up/,workdir=/tmp/work/ /tmp/merged/
mount: /tmp/merged: wrong fs type, bad option, bad superblock on overlay, missing codepage or helper program, or other error.

Дополнительная информация:

  • Докер версии 18.09.1, сборка 4c52b90
  • Ядро 4.19.0-8-amd64
  • Debian 10 (хост и образ докера)

3 ответа

Нашел то, что сработало! Установка workdir и upperdir как tmpfs помогает мне. Вот так:

      > mkdir /tmp/overlay
> mkdir /tmp/{low,merged}
> mount -t tmpfs tmpfs /tmp/overlay
> mkdir /tmp/overlay/{up,work}
> mount -t overlay overlay -o lowerdir=/tmp/low/,upperdir=/tmp/overlay/up/,workdir=/tmp/overlay/work/ /tmp/merged/ 

Мне все еще было бы интересно объяснить, почему создание оверлея без tmpfs не удается в контейнере докера?

Как смонтировать overlayfs внутри docker-контейнера:

https://gist.github.com/detunized/7c8fc4c37b49c5475e68ef9574587eee

По сути, вам нужно запустить контейнер либо с --privileged, либо с более безопасным --cap-add =SYS_ADMIN.

Это небольшое предположение, но я подозреваю, что это потому, что докер уже использует overlayfs, а overlayfs отказывается использовать в качестве другого overlayfs.

Я подозреваю, что это может быть связано с белыми файлами:

Чтобы поддерживать rm и rmdir без изменения нижней файловой системы, оверлейная файловая система должна записывать в верхнюю файловую систему, что файлы были удалены. Это делается с помощью затенения и непрозрачных каталогов (не каталоги всегда непрозрачны).

Whiteout создается как символьное устройство с номером устройства 0/0. Когда на верхнем уровне объединённого каталога обнаруживается пустое место, любое совпадающее имя на нижнем уровне игнорируется, а само белое пятно также скрывается.

Чтобы удалить файл, существующий в нижнем каталоге, overlayfs создаст файл белого цвета и скроет все файлы белого цвета (номер устройства). Это логически означает, что вы не можете создать файл символьного устройства с номером внутри overlayfs, потому что он должен быть скрыт самим overlayfs.

Если бы вам было разрешено использовать оверлеи в качестве upperdirон не сможет создавать затемненные файлы и, следовательно, не сможет rmили же rmdirлюбые файлы из нижних слоев. Потому что он не может создать файл символьного устройства с номером 0,0на другом оверлее.

Другие вопросы по тегам