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
на другом оверлее.