From 6373d4097ce9c5a63ee81bc2ea6dce5de3064098 Mon Sep 17 00:00:00 2001 From: Justin Bradford Date: Sun, 7 Dec 2025 21:58:43 -0800 Subject: [PATCH] fix: volume driver options are not used if driver if not specified [bug #210] (#211) --- pkg/client/compose/service.go | 2 +- pkg/client/compose/service_test.go | 108 +++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/pkg/client/compose/service.go b/pkg/client/compose/service.go index d8dfa75f..f5be0656 100644 --- a/pkg/client/compose/service.go +++ b/pkg/client/compose/service.go @@ -249,7 +249,7 @@ func dockerVolumeSpecFromCompose(serviceVolume types.ServiceVolumeConfig, volume } if !volume.External { - if volume.Driver != "" { + if volume.Driver != "" || len(volume.DriverOpts) > 0 { spec.VolumeOptions.Driver = &mount.Driver{ Name: volume.Driver, Options: volume.DriverOpts, diff --git a/pkg/client/compose/service_test.go b/pkg/client/compose/service_test.go index a1d38036..335031c6 100644 --- a/pkg/client/compose/service_test.go +++ b/pkg/client/compose/service_test.go @@ -586,6 +586,114 @@ services: } } +func TestServiceSpecFromCompose_VolumeDriverOpts(t *testing.T) { + tests := []struct { + name string + composeYAML string + expectedVolume api.VolumeSpec + }{ + { + name: "volume with driver_opts only (no driver specified)", + composeYAML: ` +services: + test: + image: nginx + volumes: + - nfsmount:/data/nfs +volumes: + nfsmount: + driver_opts: + type: "nfs" + o: "addr=192.168.1.100,nolock,soft" + device: ":/mnt/share" +`, + expectedVolume: api.VolumeSpec{ + Name: "nfsmount", + Type: api.VolumeTypeVolume, + VolumeOptions: &api.VolumeOptions{ + Name: "nfsmount", + Driver: &mount.Driver{ + Options: map[string]string{ + "type": "nfs", + "o": "addr=192.168.1.100,nolock,soft", + "device": ":/mnt/share", + }, + }, + }, + }, + }, + { + name: "volume with driver and driver_opts", + composeYAML: ` +services: + test: + image: nginx + volumes: + - nfsmount:/data/nfs +volumes: + nfsmount: + driver: local + driver_opts: + type: "nfs" + o: "addr=192.168.1.100,nolock,soft" + device: ":/mnt/share" +`, + expectedVolume: api.VolumeSpec{ + Name: "nfsmount", + Type: api.VolumeTypeVolume, + VolumeOptions: &api.VolumeOptions{ + Name: "nfsmount", + Driver: &mount.Driver{ + Name: "local", + Options: map[string]string{ + "type": "nfs", + "o": "addr=192.168.1.100,nolock,soft", + "device": ":/mnt/share", + }, + }, + }, + }, + }, + { + name: "external volume ignores driver_opts", + composeYAML: ` +services: + test: + image: nginx + volumes: + - extvolume:/data +volumes: + extvolume: + external: true +`, + expectedVolume: api.VolumeSpec{ + Name: "extvolume", + Type: api.VolumeTypeVolume, + VolumeOptions: &api.VolumeOptions{ + Name: "extvolume", + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + project, err := LoadProjectFromContent(context.Background(), tt.composeYAML) + require.NoError(t, err) + + spec, err := ServiceSpecFromCompose(project, "test") + require.NoError(t, err) + + require.Len(t, spec.Volumes, 1, "expected exactly one volume") + actualVolume := spec.Volumes[0] + + cmpOpts := cmp.Options{cmpopts.EquateEmpty()} + assert.True(t, cmp.Equal(actualVolume, tt.expectedVolume, cmpOpts...), + "Volume mismatch:\n%s", cmp.Diff(actualVolume, tt.expectedVolume, cmpOpts...)) + }) + } +} + func TestServiceSpecFromCompose_XMachinesPlacement(t *testing.T) { tests := []struct { name string