Skip to content
This repository was archived by the owner on Mar 22, 2022. It is now read-only.

Commit 2c1008a

Browse files
ulyssessouzandeloof
authored andcommitted
Add (fake) support for configs and secrets
- This is done by just bind mounts as in volumes Signed-off-by: Ulysses Souza <[email protected]>
1 parent 8a6613e commit 2c1008a

File tree

2 files changed

+93
-6
lines changed

2 files changed

+93
-6
lines changed

compose-ref.go

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"os"
99
"path/filepath"
1010

11-
"github.com/compose-spec/compose-ref/internal"
1211
"gopkg.in/yaml.v2"
1312

1413
"github.com/compose-spec/compose-go/loader"
@@ -19,6 +18,8 @@ import (
1918
"github.com/docker/docker/client"
2019
"github.com/docker/go-units"
2120
commandLine "github.com/urfave/cli/v2"
21+
22+
"github.com/compose-spec/compose-ref/internal"
2223
)
2324

2425
const banner = `
@@ -118,25 +119,37 @@ func doUp(project string, config *compose.Config) error {
118119
if err != nil {
119120
return err
120121
}
122+
123+
prjDir, err := filepath.Abs(filepath.Dir(config.Filename))
124+
if err != nil {
125+
return err
126+
}
127+
121128
networks, err := internal.GetNetworksFromConfig(cli, project, config)
122129
if err != nil {
123-
return err
130+
return err
124131
}
125132

126133
err = internal.GetVolumesFromConfig(cli, project, config)
127134
if err != nil {
128-
return err
135+
return err
129136
}
130137

131-
observedState, err := internal.CollectContainers(cli, project)
138+
err = internal.GetConfigsFromConfig(prjDir, config)
132139
if err != nil {
133140
return err
134141
}
135142

136-
prjDir, err := filepath.Abs(filepath.Dir(config.Filename))
143+
err = internal.GetSecretsFromConfig(prjDir, config)
137144
if err != nil {
138145
return err
139146
}
147+
148+
observedState, err := internal.CollectContainers(cli, project)
149+
if err != nil {
150+
return err
151+
}
152+
140153
err = config.WithServices(nil, func(service compose.ServiceConfig) error {
141154
containers := observedState[service.Name]
142155
delete(observedState, service.Name)
@@ -220,6 +233,16 @@ func createService(cli *client.Client, project string, prjDir string, s compose.
220233
if err != nil {
221234
return err
222235
}
236+
configMounts, err := internal.CreateContainerConfigMounts(s, prjDir)
237+
if err != nil {
238+
return err
239+
}
240+
secretsMounts, err := internal.CreateContainerSecretMounts(s, prjDir)
241+
if err != nil {
242+
return err
243+
}
244+
mounts = append(mounts, configMounts...)
245+
mounts = append(mounts, secretsMounts...)
223246
create, err := cli.ContainerCreate(ctx,
224247
&container.Config{
225248
Hostname: s.Hostname,
@@ -266,7 +289,7 @@ func createService(cli *client.Client, project string, prjDir string, s compose.
266289
}
267290
err = internal.ConnectContainerToNetworks(ctx, cli, s, create.ID, networks)
268291
if err != nil {
269-
return err
292+
return err
270293
}
271294
err = cli.ContainerStart(ctx, create.ID, types.ContainerStartOptions{})
272295
if err != nil {

internal/volume.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,29 @@ func GetVolumesFromConfig(cli *client.Client, project string, config *compose.Co
2525
return nil
2626
}
2727

28+
var fakeBindings = make(map[string]string) // Mapping on Map[ConfigName]File
29+
func GetConfigsFromConfig(prjDir string, config *compose.Config) error {
30+
for k, v := range config.Configs {
31+
name := k
32+
if v.Name != "" {
33+
name = v.Name
34+
}
35+
fakeBindings[name] = v.File
36+
}
37+
return nil
38+
}
39+
40+
func GetSecretsFromConfig(prjDir string, config *compose.Config) error {
41+
for k, v := range config.Secrets {
42+
name := k
43+
if v.Name != "" {
44+
name = v.Name
45+
}
46+
fakeBindings[name] = v.File
47+
}
48+
return nil
49+
}
50+
2851
func CreateVolume(cli *client.Client, project string, volumeDefaultName string, volumeConfig compose.VolumeConfig) error {
2952
name := volumeDefaultName
3053
if volumeConfig.Name != "" {
@@ -113,6 +136,47 @@ func collectVolumes(cli *client.Client, project string) (map[string][]types.Volu
113136
return volumes, nil
114137
}
115138

139+
func CreateContainerConfigMounts(s compose.ServiceConfig, prjDir string) ([]mount.Mount, error) {
140+
var fileRefs []compose.FileReferenceConfig
141+
for _, f := range s.Configs {
142+
fileRefs = append(fileRefs, compose.FileReferenceConfig(f))
143+
}
144+
return createFakeMounts(fileRefs, prjDir)
145+
}
146+
147+
func CreateContainerSecretMounts(s compose.ServiceConfig, prjDir string) ([]mount.Mount, error) {
148+
var fileRefs []compose.FileReferenceConfig
149+
for _, f := range s.Secrets {
150+
fileRefs = append(fileRefs, compose.FileReferenceConfig(f))
151+
}
152+
return createFakeMounts(fileRefs, prjDir)
153+
}
154+
155+
func createFakeMounts(fileRefs []compose.FileReferenceConfig, prjDir string) ([]mount.Mount, error) {
156+
var mounts []mount.Mount
157+
for _, v := range fileRefs {
158+
source, ok := fakeBindings[v.Source]
159+
if !ok {
160+
source = v.Source
161+
}
162+
target := v.Target
163+
if target == "" {
164+
target = filepath.Join("/", source)
165+
}
166+
if !filepath.IsAbs(source) {
167+
source = filepath.Join(prjDir, source)
168+
}
169+
mounts = append(mounts, mount.Mount{
170+
Type: compose.VolumeTypeBind,
171+
Source: source,
172+
Target: target,
173+
ReadOnly: true,
174+
Consistency: mount.ConsistencyDefault,
175+
})
176+
}
177+
return mounts, nil
178+
}
179+
116180
func CreateContainerMounts(s compose.ServiceConfig, prjDir string) ([]mount.Mount, error) {
117181
var mounts []mount.Mount
118182
for _, v := range s.Volumes {

0 commit comments

Comments
 (0)