From 814536c0bd2099ca31632b2d1c5ae9bc50481c8d Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Fri, 4 Dec 2020 10:28:43 +0100 Subject: [PATCH] Fixing bind mount with relative path when specifying relative working dir. Added first local compose volume e2e test Signed-off-by: Guillaume Tardif --- local/compose.go | 17 ++++++++++++----- local/e2e/compose_test.go | 19 ++++++++++++++++++- local/e2e/volume-test/docker-compose.yml | 7 +++++++ local/e2e/volume-test/static/index.html | 10 ++++++++++ 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 local/e2e/volume-test/docker-compose.yml create mode 100644 local/e2e/volume-test/static/index.html diff --git a/local/compose.go b/local/compose.go index a6653e332..e73c32ad7 100644 --- a/local/compose.go +++ b/local/compose.go @@ -800,7 +800,10 @@ func getContainerCreateOptions(p *types.Project, s types.ServiceConfig, number i StopTimeout: toSeconds(s.StopGracePeriod), } - mountOptions := buildContainerMountOptions(p, s, inherit) + mountOptions, err := buildContainerMountOptions(p, s, inherit) + if err != nil { + return nil, nil, nil, err + } bindings := buildContainerBindingOptions(s) networkMode := getNetworkMode(p, s) @@ -844,7 +847,7 @@ func buildContainerBindingOptions(s types.ServiceConfig) nat.PortMap { return bindings } -func buildContainerMountOptions(p *types.Project, s types.ServiceConfig, inherit *moby.Container) []mount.Mount { +func buildContainerMountOptions(p *types.Project, s types.ServiceConfig, inherit *moby.Container) ([]mount.Mount, error) { mounts := []mount.Mount{} var inherited []string if inherit != nil { @@ -872,8 +875,12 @@ func buildContainerMountOptions(p *types.Project, s types.ServiceConfig, inherit } source := v.Source if v.Type == "bind" && !filepath.IsAbs(source) { - // FIXME handle ~/ - source = filepath.Join(p.WorkingDir, source) + // volume source has already been prefixed with workdir if required, by compose-go project loader + var err error + source, err = filepath.Abs(source) + if err != nil { + return nil, err + } } mounts = append(mounts, mount.Mount{ @@ -887,7 +894,7 @@ func buildContainerMountOptions(p *types.Project, s types.ServiceConfig, inherit TmpfsOptions: buildTmpfsOptions(v.Tmpfs), }) } - return mounts + return mounts, nil } func buildBindOption(bind *types.ServiceVolumeBind) *mount.BindOptions { diff --git a/local/e2e/compose_test.go b/local/e2e/compose_test.go index 9e5ea535f..a9042f352 100644 --- a/local/e2e/compose_test.go +++ b/local/e2e/compose_test.go @@ -28,7 +28,7 @@ import ( . "github.com/docker/compose-cli/tests/framework" ) -func TestLocalBackendComposeUp(t *testing.T) { +func TestLocalComposeUp(t *testing.T) { c := NewParallelE2eCLI(t, binDir) c.RunDockerCmd("context", "create", "local", "test-context").Assert(t, icmd.Success) c.RunDockerCmd("context", "use", "test-context").Assert(t, icmd.Success) @@ -86,3 +86,20 @@ func TestLocalBackendComposeUp(t *testing.T) { assert.Equal(t, networkList.Stdout(), networksAfterDown.Stdout()) }) } + +func TestLocalComposeVolume(t *testing.T) { + c := NewParallelE2eCLI(t, binDir) + c.RunDockerCmd("context", "create", "local", "test-context").Assert(t, icmd.Success) + c.RunDockerCmd("context", "use", "test-context").Assert(t, icmd.Success) + + const projectName = "compose-e2e-volume" + + t.Run("up with volume", func(t *testing.T) { + c.RunDockerCmd("compose", "up", "--workdir", "volume-test", "--project-name", projectName) + + output := HTTPGetWithRetry(t, "http://localhost:8090", http.StatusOK, 2*time.Second, 20*time.Second) + assert.Assert(t, strings.Contains(output, "Hello from Nginx container")) + + _ = c.RunDockerCmd("compose", "down", "--project-name", projectName) + }) +} diff --git a/local/e2e/volume-test/docker-compose.yml b/local/e2e/volume-test/docker-compose.yml new file mode 100644 index 000000000..09afab385 --- /dev/null +++ b/local/e2e/volume-test/docker-compose.yml @@ -0,0 +1,7 @@ +services: + nginx: + image: nginx + volumes: + - ./static:/usr/share/nginx/html + ports: + - 8090:80 diff --git a/local/e2e/volume-test/static/index.html b/local/e2e/volume-test/static/index.html new file mode 100644 index 000000000..0c7642bcb --- /dev/null +++ b/local/e2e/volume-test/static/index.html @@ -0,0 +1,10 @@ + + + + + Docker Nginx + + +

Hello from Nginx container

+ + \ No newline at end of file