Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

executor: fix overlay layer limit for non-rootfs mounts #4815

Merged
merged 1 commit into from
Apr 1, 2024

Conversation

tonistiigi
Copy link
Member

fix #4810

Historic layer limit for Docker images is 127. Because in overlayfs mounting 127 layers usually reaches the page size limit of mount options in Linux kernel, there is special code to work around the limitation.

This custom code was used for rootfs of container because runc takes rootfs as a directory path, meaning buildkit needs to mount it and then pass the path. For non-rootfs mounts runc takes them as direct mount configuration and performs the mount itself. As runc does not have this special way to mount long overlayfs mounts it will perform the mount with clipped options what will fail in some way in kernel depending on the precise cutoff point.

Workaround is to detect when the mount passed to runc is too long for runc to mount it itself and it that case let BuildKit mount it and in runc perform bind of the BuildKit mount.

Historic layer limit for Docker images is 127. Because in
overlayfs mounting 127 layers usually reaches the page size
limit of mount options in Linux kernel, there is special code
to work around the limitation.

This custom code was used for rootfs of container because
runc takes rootfs as a directory path, meaning buildkit needs
to mount it and then pass the path. For non-rootfs mounts
runc takes them as direct mount configuration and performs
the mount itself. As runc does not have this special way to
mount long overlayfs mounts it will perform the mount with clipped
options what will fail in some way in kernel depending on the
precise cutoff point.

Workaround is to detect when the mount passed to runc is too
long for runc to mount it itself and it that case let
BuildKit mount it and in runc perform bind of the BuildKit mount.

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
@AkihiroSuda AkihiroSuda merged commit 5f73c5d into moby:master Apr 1, 2024
72 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Overlay layer limit lower for non-rootfs mounts
2 participants