Почему docker-in-docker использует так много места на диске?

Почему docker-in-docker использует так много места на диске?

Я часто запускаю VS Code devcontainer для разработки дополнения Home Assistant. Этот devcontainer запускает Docker (внутри моего хостового Docker). После нескольких часов работы на моем хостовом Docker заканчивается место на диске, что вызывает различные проблемы. Здесь показано, что этот dev-контейнер использует 52 ГБ, что, по моему мнению, избыточно.

% docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          1         1         1.333GB   0B (0%)
Containers      1         1         52.17GB   0B (0%)
Local Volumes   1         1         220.2MB   0B (0%)
Build Cache     0         0         0B        0B

Внутри контейнера dev dfвидно, что большая часть этого использования приходится на Docker VFS:

% docker exec 7f666319eddf du -hd 1 /var/lib/docker/       
54G /var/lib/docker/vfs
448K    /var/lib/docker/containerd
8.0K    /var/lib/docker/tmp
20M /var/lib/docker/image
28K /var/lib/docker/volumes
4.0K    /var/lib/docker/swarm
3.1M    /var/lib/docker/containers
116K    /var/lib/docker/buildkit
16K /var/lib/docker/plugins
4.0K    /var/lib/docker/runtimes
88K /var/lib/docker/network
54G /var/lib/docker/

Но внутри контейнера Docker считает, что его контейнеры используют менее 1 ГБ.

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          21        19        2.829GB   714.7MB (25%)
Containers      100       8         628.7MB   605.8MB (96%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

И все же, после запуска docker container prune54 ГБ сжимаются до 28 ГБ. Так почему же это использование не отображается в docker system df?

Я использую Docker Desktop 4.28.0 на macOS Sonoma. У меня та же проблема на Ventura.

решение1

Это часто случается, когда /var/lib/dockerнаходится внутри контейнера, а не тома. Файловая система контейнера часто будет оверлейной, и невозможно определить оверлейную файловую систему внутри оверлейной файловой системы.

Если драйвер файловой системы с несколькими уровнями недоступен, то можно использовать «родной» или «vfs» драйвер, который является просто копией всей файловой системы для каждого уровня. Таким образом, если у вас есть образ размером 100 МБ и вы добавляете один файл размером 1 МБ в образ docker, то теперь у вас есть 201 МБ памяти на диске, 100 МБ для исходного слоя и 101 МБ для нового слоя. Каждому контейнеру также необходимо добавить слой чтения/записи в файловую систему, поэтому весь образ копируется для каждого созданного контейнера.

Исправление заключается в монтировании тома /var/lib/dockerи обеспечении того, чтобы источником для этого монтирования былподдерживаемая резервная файловая системаодним из драйверов многоуровневой файловой системы.

Связанный контент