diff --git a/bake/compose.go b/bake/compose.go index 44bfe5dc..37e7782e 100644 --- a/bake/compose.go +++ b/bake/compose.go @@ -187,25 +187,25 @@ func (t *Target) composeExtTarget(exts map[string]interface{}) error { } if len(xb.Tags) > 0 { - t.Tags = append(t.Tags, xb.Tags...) + t.Tags = dedupString(append(t.Tags, xb.Tags...)) } if len(xb.CacheFrom) > 0 { - t.CacheFrom = append(t.CacheFrom, xb.CacheFrom...) + t.CacheFrom = dedupString(append(t.CacheFrom, xb.CacheFrom...)) } if len(xb.CacheTo) > 0 { - t.CacheTo = append(t.CacheTo, xb.CacheTo...) + t.CacheTo = dedupString(append(t.CacheTo, xb.CacheTo...)) } if len(xb.Secrets) > 0 { - t.Secrets = append(t.Secrets, xb.Secrets...) + t.Secrets = dedupString(append(t.Secrets, xb.Secrets...)) } if len(xb.SSH) > 0 { - t.SSH = append(t.SSH, xb.SSH...) + t.SSH = dedupString(append(t.SSH, xb.SSH...)) } if len(xb.Platforms) > 0 { - t.Platforms = append(t.Platforms, xb.Platforms...) + t.Platforms = dedupString(append(t.Platforms, xb.Platforms...)) } if len(xb.Outputs) > 0 { - t.Outputs = append(t.Outputs, xb.Outputs...) + t.Outputs = dedupString(append(t.Outputs, xb.Outputs...)) } if xb.Pull != nil { t.Pull = xb.Pull @@ -214,7 +214,7 @@ func (t *Target) composeExtTarget(exts map[string]interface{}) error { t.NoCache = xb.NoCache } if len(xb.NoCacheFilter) > 0 { - t.NoCacheFilter = append(t.NoCacheFilter, xb.NoCacheFilter...) + t.NoCacheFilter = dedupString(append(t.NoCacheFilter, xb.NoCacheFilter...)) } return nil diff --git a/bake/compose_test.go b/bake/compose_test.go index 7ab3ad9f..a3af03b9 100644 --- a/bake/compose_test.go +++ b/bake/compose_test.go @@ -316,6 +316,37 @@ services: require.Equal(t, c.Targets[1].NoCache, newBool(true)) } +func TestComposeExtDedup(t *testing.T) { + var dt = []byte(` +services: + webapp: + image: app:bar + build: + cache_from: + - user/app:cache + cache_to: + - user/app:cache + tags: + - ct-addon:foo + x-bake: + tags: + - ct-addon:foo + - ct-addon:baz + cache-from: + - user/app:cache + - type=local,src=path/to/cache + cache-to: + - type=local,dest=path/to/cache +`) + + c, err := ParseCompose(dt) + require.NoError(t, err) + require.Equal(t, 1, len(c.Targets)) + require.Equal(t, c.Targets[0].Tags, []string{"ct-addon:foo", "ct-addon:baz"}) + require.Equal(t, c.Targets[0].CacheFrom, []string{"user/app:cache", "type=local,src=path/to/cache"}) + require.Equal(t, c.Targets[0].CacheTo, []string{"user/app:cache", "type=local,dest=path/to/cache"}) +} + func TestEnv(t *testing.T) { envf, err := os.CreateTemp("", "env") require.NoError(t, err)