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

Commit

Permalink
Add (fake) support for configs and secrets
Browse files Browse the repository at this point in the history
- This is done by just bind mounts as in volumes

Signed-off-by: Ulysses Souza <[email protected]>
  • Loading branch information
ulyssessouza authored and ndeloof committed Feb 12, 2020
1 parent 8a6613e commit 2c1008a
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 6 deletions.
35 changes: 29 additions & 6 deletions compose-ref.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"os"
"path/filepath"

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

"github.com/compose-spec/compose-go/loader"
Expand All @@ -19,6 +18,8 @@ import (
"github.com/docker/docker/client"
"github.com/docker/go-units"
commandLine "github.com/urfave/cli/v2"

"github.com/compose-spec/compose-ref/internal"
)

const banner = `
Expand Down Expand Up @@ -118,25 +119,37 @@ func doUp(project string, config *compose.Config) error {
if err != nil {
return err
}

prjDir, err := filepath.Abs(filepath.Dir(config.Filename))
if err != nil {
return err
}

networks, err := internal.GetNetworksFromConfig(cli, project, config)
if err != nil {
return err
return err
}

err = internal.GetVolumesFromConfig(cli, project, config)
if err != nil {
return err
return err
}

observedState, err := internal.CollectContainers(cli, project)
err = internal.GetConfigsFromConfig(prjDir, config)
if err != nil {
return err
}

prjDir, err := filepath.Abs(filepath.Dir(config.Filename))
err = internal.GetSecretsFromConfig(prjDir, config)
if err != nil {
return err
}

observedState, err := internal.CollectContainers(cli, project)
if err != nil {
return err
}

err = config.WithServices(nil, func(service compose.ServiceConfig) error {
containers := observedState[service.Name]
delete(observedState, service.Name)
Expand Down Expand Up @@ -220,6 +233,16 @@ func createService(cli *client.Client, project string, prjDir string, s compose.
if err != nil {
return err
}
configMounts, err := internal.CreateContainerConfigMounts(s, prjDir)
if err != nil {
return err
}
secretsMounts, err := internal.CreateContainerSecretMounts(s, prjDir)
if err != nil {
return err
}
mounts = append(mounts, configMounts...)
mounts = append(mounts, secretsMounts...)
create, err := cli.ContainerCreate(ctx,
&container.Config{
Hostname: s.Hostname,
Expand Down Expand Up @@ -266,7 +289,7 @@ func createService(cli *client.Client, project string, prjDir string, s compose.
}
err = internal.ConnectContainerToNetworks(ctx, cli, s, create.ID, networks)
if err != nil {
return err
return err
}
err = cli.ContainerStart(ctx, create.ID, types.ContainerStartOptions{})
if err != nil {
Expand Down
64 changes: 64 additions & 0 deletions internal/volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,29 @@ func GetVolumesFromConfig(cli *client.Client, project string, config *compose.Co
return nil
}

var fakeBindings = make(map[string]string) // Mapping on Map[ConfigName]File
func GetConfigsFromConfig(prjDir string, config *compose.Config) error {
for k, v := range config.Configs {
name := k
if v.Name != "" {
name = v.Name
}
fakeBindings[name] = v.File
}
return nil
}

func GetSecretsFromConfig(prjDir string, config *compose.Config) error {
for k, v := range config.Secrets {
name := k
if v.Name != "" {
name = v.Name
}
fakeBindings[name] = v.File
}
return nil
}

func CreateVolume(cli *client.Client, project string, volumeDefaultName string, volumeConfig compose.VolumeConfig) error {
name := volumeDefaultName
if volumeConfig.Name != "" {
Expand Down Expand Up @@ -113,6 +136,47 @@ func collectVolumes(cli *client.Client, project string) (map[string][]types.Volu
return volumes, nil
}

func CreateContainerConfigMounts(s compose.ServiceConfig, prjDir string) ([]mount.Mount, error) {
var fileRefs []compose.FileReferenceConfig
for _, f := range s.Configs {
fileRefs = append(fileRefs, compose.FileReferenceConfig(f))
}
return createFakeMounts(fileRefs, prjDir)
}

func CreateContainerSecretMounts(s compose.ServiceConfig, prjDir string) ([]mount.Mount, error) {
var fileRefs []compose.FileReferenceConfig
for _, f := range s.Secrets {
fileRefs = append(fileRefs, compose.FileReferenceConfig(f))
}
return createFakeMounts(fileRefs, prjDir)
}

func createFakeMounts(fileRefs []compose.FileReferenceConfig, prjDir string) ([]mount.Mount, error) {
var mounts []mount.Mount
for _, v := range fileRefs {
source, ok := fakeBindings[v.Source]
if !ok {
source = v.Source
}
target := v.Target
if target == "" {
target = filepath.Join("/", source)
}
if !filepath.IsAbs(source) {
source = filepath.Join(prjDir, source)
}
mounts = append(mounts, mount.Mount{
Type: compose.VolumeTypeBind,
Source: source,
Target: target,
ReadOnly: true,
Consistency: mount.ConsistencyDefault,
})
}
return mounts, nil
}

func CreateContainerMounts(s compose.ServiceConfig, prjDir string) ([]mount.Mount, error) {
var mounts []mount.Mount
for _, v := range s.Volumes {
Expand Down

0 comments on commit 2c1008a

Please sign in to comment.