github.com/flanksource/konfigadm@v0.12.0/pkg/phases/containers.go (about) 1 package phases 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/flanksource/konfigadm/pkg/types" 8 ) 9 10 var Containers types.Phase = containers{} 11 12 type containers struct{} 13 14 func (p containers) ApplyPhase(sys *types.Config, ctx *types.SystemContext) ([]types.Command, types.Filesystem, error) { 15 var commands []types.Command 16 files := types.Filesystem{} 17 for _, c := range sys.Containers { 18 19 sys.Services[c.Name()] = types.Service{ 20 Name: c.Name(), 21 ExecStart: exec(sys, c), 22 Extra: types.DefaultSystemdService(c.Name()), 23 } 24 if len(c.Env) > 0 { 25 files["/etc/environment."+c.Name()] = types.File{Content: toEnvironmentFile(ctx, c)} 26 } 27 28 } 29 return commands, files, nil 30 } 31 32 func (p containers) Verify(cfg *types.Config, results *types.VerifyResults, flags ...types.Flag) bool { 33 verify := true 34 for f := range cfg.Files { 35 36 if _, err := os.Stat(f); err != nil { 37 verify = false 38 results.Fail("%s does not exist", f) 39 } else { 40 results.Pass("%s exists", f) 41 } 42 } 43 44 for f := range cfg.Templates { 45 if _, err := os.Stat(f); err != nil { 46 verify = false 47 results.Fail("%s does not exist", f) 48 } else { 49 results.Pass("%s exists", f) 50 } 51 } 52 53 return verify 54 } 55 56 func toEnvironmentFile(ctx *types.SystemContext, c types.Container) string { 57 s := "" 58 for k, v := range c.Env { 59 s += fmt.Sprintf("%s=%s\n", k, v) 60 } 61 return s 62 } 63 64 func exec(sys *types.Config, c types.Container) string { 65 exec := c.DockerOpts 66 if len(c.Env) > 0 { 67 exec += fmt.Sprintf(" --env-file /etc/environment.%s", c.Name()) 68 } 69 if c.Network != "" { 70 exec += " --network " + c.Network 71 } 72 73 for _, v := range c.Volumes { 74 exec += fmt.Sprintf(" -v %s", v) 75 } 76 77 for _, p := range c.Ports { 78 exec += fmt.Sprintf(" -p %d:%d", p.Port, p.Target) 79 } 80 81 return fmt.Sprintf("%s run --rm --name %s %s %s %s", sys.ContainerRuntime.GetCLI(), c.Name(), exec, c.Image, c.Args) 82 }