diff --git a/compose-ref.go b/compose-ref.go index 2c226cb..f3d0754 100644 --- a/compose-ref.go +++ b/compose-ref.go @@ -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" @@ -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 = ` @@ -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) @@ -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, @@ -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 { diff --git a/internal/volume.go b/internal/volume.go index 09a0e03..627f49e 100644 --- a/internal/volume.go +++ b/internal/volume.go @@ -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 != "" { @@ -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 {