Skip to content

Commit ee75be3

Browse files
committed
Set secret/config uid:gid to match container's USER
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent 1576174 commit ee75be3

File tree

4 files changed

+79
-2
lines changed

4 files changed

+79
-2
lines changed

pkg/compose/run.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,17 @@ func (s *composeService) prepareRun(ctx context.Context, project *types.Project,
133133
return "", err
134134
}
135135

136-
err = s.injectSecrets(ctx, project, service, created.ID)
136+
ctr, err := s.apiClient().ContainerInspect(ctx, created.ID)
137+
if err != nil {
138+
return "", err
139+
}
140+
141+
err = s.injectSecrets(ctx, project, service, ctr.ID)
137142
if err != nil {
138143
return created.ID, err
139144
}
140145

141-
err = s.injectConfigs(ctx, project, service, created.ID)
146+
err = s.injectConfigs(ctx, project, service, ctr.ID)
142147
return created.ID, err
143148
}
144149

pkg/compose/secrets.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ import (
2222
"context"
2323
"fmt"
2424
"strconv"
25+
"strings"
2526
"time"
2627

2728
"github.com/compose-spec/compose-go/v2/types"
2829
"github.com/docker/docker/api/types/container"
2930
)
3031

3132
func (s *composeService) injectSecrets(ctx context.Context, project *types.Project, service types.ServiceConfig, id string) error {
33+
var ctrConfig *container.Config
3234
for _, config := range service.Secrets {
3335
file := project.Secrets[config.Source]
3436
if file.Environment == "" {
@@ -53,6 +55,25 @@ func (s *composeService) injectSecrets(ctx context.Context, project *types.Proje
5355
}
5456
content = env
5557
}
58+
59+
if config.UID == "" && config.GID == "" {
60+
if ctrConfig == nil {
61+
ctr, err := s.apiClient().ContainerInspect(ctx, id)
62+
if err != nil {
63+
return err
64+
}
65+
ctrConfig = ctr.Config
66+
}
67+
68+
parts := strings.Split(ctrConfig.User, ":")
69+
if len(parts) > 0 {
70+
config.UID = parts[0]
71+
}
72+
if len(parts) > 1 {
73+
config.GID = parts[1]
74+
}
75+
}
76+
5677
b, err := createTar(content, types.FileReferenceConfig(config))
5778
if err != nil {
5879
return err
@@ -69,6 +90,7 @@ func (s *composeService) injectSecrets(ctx context.Context, project *types.Proje
6990
}
7091

7192
func (s *composeService) injectConfigs(ctx context.Context, project *types.Project, service types.ServiceConfig, id string) error {
93+
var ctrConfig *container.Config
7294
for _, config := range service.Configs {
7395
file := project.Configs[config.Source]
7496
content := file.Content
@@ -91,6 +113,24 @@ func (s *composeService) injectConfigs(ctx context.Context, project *types.Proje
91113
config.Target = "/" + config.Source
92114
}
93115

116+
if config.UID == "" && config.GID == "" {
117+
if ctrConfig == nil {
118+
ctr, err := s.apiClient().ContainerInspect(ctx, id)
119+
if err != nil {
120+
return err
121+
}
122+
ctrConfig = ctr.Config
123+
}
124+
125+
parts := strings.Split(ctrConfig.User, ":")
126+
if len(parts) > 0 {
127+
config.UID = parts[0]
128+
}
129+
if len(parts) > 1 {
130+
config.GID = parts[1]
131+
}
132+
}
133+
94134
b, err := createTar(content, types.FileReferenceConfig(config))
95135
if err != nil {
96136
return err

pkg/e2e/fixtures/env-secret/compose.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,23 @@ services:
1414
mode: 0440
1515
command: cat /run/secrets/bar
1616

17+
bar:
18+
image: alpine
19+
user: "1005"
20+
secrets:
21+
- source: secret
22+
target: bar
23+
command: cat /run/secrets/bar
24+
25+
zot:
26+
image: alpine
27+
user: "1005:1005"
28+
secrets:
29+
- source: secret
30+
target: bar
31+
command: cat /run/secrets/bar
32+
33+
1734
secrets:
1835
secret:
1936
environment: SECRET

pkg/e2e/secrets_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,21 @@ func TestSecretFromEnv(t *testing.T) {
4040
})
4141
res.Assert(t, icmd.Expected{Out: "-r--r----- 1 1005 1005"})
4242
})
43+
t.Run("secret uid from user", func(t *testing.T) {
44+
res := icmd.RunCmd(c.NewDockerComposeCmd(t, "-f", "./fixtures/env-secret/compose.yaml", "run", "bar", "ls", "-al", "/var/run/secrets/bar"),
45+
func(cmd *icmd.Cmd) {
46+
cmd.Env = append(cmd.Env, "SECRET=BAR")
47+
})
48+
res.Assert(t, icmd.Expected{Out: "-r--r--r-- 1 1005 root"})
49+
})
50+
t.Run("secret uid:gid from user", func(t *testing.T) {
51+
res := icmd.RunCmd(c.NewDockerComposeCmd(t, "-f", "./fixtures/env-secret/compose.yaml", "run", "zot", "ls", "-al", "/var/run/secrets/bar"),
52+
func(cmd *icmd.Cmd) {
53+
cmd.Env = append(cmd.Env, "SECRET=BAR")
54+
})
55+
res.Assert(t, icmd.Expected{Out: "-r--r--r-- 1 1005 1005"})
56+
})
57+
4358
}
4459

4560
func TestSecretFromInclude(t *testing.T) {

0 commit comments

Comments
 (0)