diff --git a/go.mod b/go.mod index 65ea1f49b..610b5b9b1 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/AlecAivazis/survey/v2 v2.3.2 github.com/buger/goterm v1.0.4 github.com/cnabio/cnab-to-oci v0.3.1-beta1 - github.com/compose-spec/compose-go v1.2.2 + github.com/compose-spec/compose-go v1.2.3 github.com/containerd/console v1.0.3 github.com/containerd/containerd v1.6.2 github.com/distribution/distribution/v3 v3.0.0-20210316161203-a01c71e2477e diff --git a/go.sum b/go.sum index c3a871652..5c841e50d 100644 --- a/go.sum +++ b/go.sum @@ -302,8 +302,8 @@ github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoC github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/compose-spec/compose-go v1.0.8/go.mod h1:REnCbBugoIdHB7S1sfkN/aJ7AJpNApGNjNiVjA9L8x4= -github.com/compose-spec/compose-go v1.2.2 h1:y1dwl3KUTBnWPVur6EZno9zUIum6Q87/F5keljnGQB4= -github.com/compose-spec/compose-go v1.2.2/go.mod h1:pAy7Mikpeft4pxkFU565/DRHEbDfR84G6AQuiL+Hdg8= +github.com/compose-spec/compose-go v1.2.3 h1:r9zZfxQKG2A3fTy/MobMecUR1cd3uf7DlQQeB/NKVJ0= +github.com/compose-spec/compose-go v1.2.3/go.mod h1:pAy7Mikpeft4pxkFU565/DRHEbDfR84G6AQuiL+Hdg8= github.com/compose-spec/godotenv v1.1.1/go.mod h1:zF/3BOa18Z24tts5qnO/E9YURQanJTBUf7nlcCTNsyc= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= diff --git a/pkg/compose/create.go b/pkg/compose/create.go index e5e23e29f..6eb9c3572 100644 --- a/pkg/compose/create.go +++ b/pkg/compose/create.go @@ -713,11 +713,13 @@ func (s *composeService) buildContainerVolumes(ctx context.Context, p types.Proj MOUNTS: for _, m := range mountOptions { volumeMounts[m.Target] = struct{}{} - // `Bind` API is used when host path need to be created if missing, `Mount` is preferred otherwise if m.Type == mount.TypeBind || m.Type == mount.TypeNamedPipe { + // `Mount` is preferred but does not offer option to created host path if missing + // so `Bind` API is used here with raw volume string + // see https://github.com/moby/moby/issues/43483 for _, v := range service.Volumes { if v.Target == m.Target && v.Bind != nil && v.Bind.CreateHostPath { - binds = append(binds, fmt.Sprintf("%s:%s:%s", m.Source, m.Target, getBindMode(v.Bind, m.ReadOnly))) + binds = append(binds, v.String()) continue MOUNTS } } @@ -727,23 +729,6 @@ MOUNTS: return volumeMounts, binds, mounts, nil } -func getBindMode(bind *types.ServiceVolumeBind, readOnly bool) string { - mode := "rw" - - if readOnly { - mode = "ro" - } - - switch bind.SELinux { - case types.SELinuxShared: - mode += ",z" - case types.SELinuxPrivate: - mode += ",Z" - } - - return mode -} - func buildContainerMountOptions(p types.Project, s types.ServiceConfig, img moby.ImageInspect, inherit *moby.Container) ([]mount.Mount, error) { var mounts = map[string]mount.Mount{} if inherit != nil { diff --git a/pkg/compose/create_test.go b/pkg/compose/create_test.go index ea2ec88ad..6c6a4f198 100644 --- a/pkg/compose/create_test.go +++ b/pkg/compose/create_test.go @@ -143,15 +143,6 @@ func TestBuildContainerMountOptions(t *testing.T) { assert.Equal(t, mounts[1].Target, "/var/myvolume2") } -func TestGetBindMode(t *testing.T) { - assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{}, false), "rw") - assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{}, true), "ro") - assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{SELinux: composetypes.SELinuxShared}, false), "rw,z") - assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{SELinux: composetypes.SELinuxPrivate}, false), "rw,Z") - assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{SELinux: composetypes.SELinuxShared}, true), "ro,z") - assert.Equal(t, getBindMode(&composetypes.ServiceVolumeBind{SELinux: composetypes.SELinuxPrivate}, true), "ro,Z") -} - func TestGetDefaultNetworkMode(t *testing.T) { t.Run("returns the network with the highest priority when service has multiple networks", func(t *testing.T) { service := composetypes.ServiceConfig{