From 3903f95b8224256391ff92b48d6f6b89e49b234a Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Wed, 21 Dec 2022 10:14:58 +0100 Subject: [PATCH] resolve device path for local bind mount volumes Signed-off-by: Nicolas De Loof --- loader/loader_test.go | 23 +++++++++++++++++++++++ loader/normalize.go | 8 ++++++++ 2 files changed, 31 insertions(+) diff --git a/loader/loader_test.go b/loader/loader_test.go index a7552492..66a9252a 100644 --- a/loader/loader_test.go +++ b/loader/loader_test.go @@ -2131,3 +2131,26 @@ services: assert.Equal(t, "env-var-web", svc.ContainerName) }) } + +func TestLoadWithBindMountVolume(t *testing.T) { + dict := ` +services: + web: + image: web + volumes: + - data:/data +volumes: + data: + driver: local + driver_opts: + type: 'none' + o: 'bind' + device: './data' +` + configDetails := buildConfigDetails(dict, nil) + + project, err := Load(configDetails) + assert.NilError(t, err) + path := project.Volumes["data"].DriverOpts["device"] + assert.Check(t, filepath.IsAbs(path)) +} diff --git a/loader/normalize.go b/loader/normalize.go index 4b98d624..00ab0098 100644 --- a/loader/normalize.go +++ b/loader/normalize.go @@ -110,6 +110,14 @@ func normalize(project *types.Project, resolvePaths bool) error { project.Services[i] = s } + for name, config := range project.Volumes { + if config.Driver == "local" && config.DriverOpts["o"] == "bind" { + // This is actually a bind mount + config.DriverOpts["device"] = absPath(project.WorkingDir, config.DriverOpts["device"]) + project.Volumes[name] = config + } + } + setNameFromKey(project) return nil