diff --git a/daemon/mounts.go b/daemon/mounts.go index ad637df03d073..6a4d22cc091d4 100644 --- a/daemon/mounts.go +++ b/daemon/mounts.go @@ -18,6 +18,10 @@ func (daemon *Daemon) prepareMountPoints(container *container.Container) error { if err := daemon.lazyInitializeVolume(container.ID, config); err != nil { return err } + if config.Volume == nil { + // FIXME(thaJeztah): should we check for config.Type here as well? (i.e., skip bind-mounts etc) + continue + } if alive { log.G(context.TODO()).WithFields(logrus.Fields{ "container": container.ID, diff --git a/integration/daemon/daemon_test.go b/integration/daemon/daemon_test.go index 9dcaed374757b..b6e00c81b9c04 100644 --- a/integration/daemon/daemon_test.go +++ b/integration/daemon/daemon_test.go @@ -436,6 +436,24 @@ func testLiveRestoreVolumeReferences(t *testing.T) { err = c.VolumeRemove(ctx, v.Name, false) assert.NilError(t, err) }) + + // Make sure that we don't panic if the container has bind-mounts + // (which should not be "restored") + // Regression test for https://github.com/moby/moby/issues/45898 + t.Run("container with bind-mounts", func(t *testing.T) { + m := mount.Mount{ + Type: mount.TypeBind, + Source: os.TempDir(), + Target: "/foo", + } + cID := container.Run(ctx, t, c, container.WithMount(m), container.WithCmd("top")) + defer c.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{Force: true}) + + d.Restart(t, "--live-restore", "--iptables=false") + + err := c.ContainerRemove(ctx, cID, types.ContainerRemoveOptions{Force: true}) + assert.NilError(t, err) + }) } func TestDaemonDefaultBridgeWithFixedCidrButNoBip(t *testing.T) {