From ea4e57145cb1aefcb457d294af19a8d8baf6ff3d Mon Sep 17 00:00:00 2001 From: Justin SB Date: Tue, 19 Feb 2019 18:08:40 -0500 Subject: [PATCH] Workaround for overlay2 vs rhel-family docker bug Docker 17.x with rhel-family fails to detect overlay2 correctly, and need us to pass overlay2.override_kernel_check=true for docker to correctly detect overlay2 support. --- nodeup/pkg/model/docker.go | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/nodeup/pkg/model/docker.go b/nodeup/pkg/model/docker.go index a578855801..dd5852d9e5 100644 --- a/nodeup/pkg/model/docker.go +++ b/nodeup/pkg/model/docker.go @@ -675,6 +675,18 @@ func (d *dockerVersion) matches(arch Architecture, dockerVersion string, distro return true } +func (b *DockerBuilder) dockerVersion() string { + dockerVersion := "" + if b.Cluster.Spec.Docker != nil { + dockerVersion = fi.StringValue(b.Cluster.Spec.Docker.Version) + } + if dockerVersion == "" { + dockerVersion = DefaultDockerVersion + glog.Warningf("DockerVersion not specified; using default %q", dockerVersion) + } + return dockerVersion +} + // Build is responsible for configuring the docker daemon func (b *DockerBuilder) Build(c *fi.ModelBuilderContext) error { @@ -705,14 +717,7 @@ func (b *DockerBuilder) Build(c *fi.ModelBuilderContext) error { c.AddTask(t) } - dockerVersion := "" - if b.Cluster.Spec.Docker != nil { - dockerVersion = fi.StringValue(b.Cluster.Spec.Docker.Version) - } - if dockerVersion == "" { - dockerVersion = DefaultDockerVersion - glog.Warningf("DockerVersion not specified; using default %q", dockerVersion) - } + dockerVersion := b.dockerVersion() // Add packages { @@ -990,6 +995,21 @@ func (b *DockerBuilder) buildSysconfig(c *fi.ModelBuilderContext) error { } } + // RHEL-family / docker has a bug with 17.x where it fails to use overlay2 because it does a broken kernel check + if b.Distribution.IsRHELFamily() { + dockerVersion := b.dockerVersion() + if strings.HasPrefix(dockerVersion, "17.") { + storageOpts := strings.Join(docker.StorageOpts, ",") + if strings.Contains(storageOpts, "overlay2.override_kernel_check=1") { + // Already there + } else if !strings.Contains(storageOpts, "overlay2.override_kernel_check") { + docker.StorageOpts = append(docker.StorageOpts, "overlay2.override_kernel_check=1") + } else { + glog.Infof("detected image was RHEL and overlay2.override_kernel_check=1 was probably needed, but overlay2.override_kernel_check was already set (%q) so won't set", storageOpts) + } + } + } + flagsString, err := flagbuilder.BuildFlags(&docker) if err != nil { return fmt.Errorf("error building docker flags: %v", err)