diff --git a/.ledo.yml b/.ledo.yml index 2d30508..134348d 100644 --- a/.ledo.yml +++ b/.ledo.yml @@ -8,15 +8,3 @@ docker: modes: dev: docker/docker-compose.yml docker/docker-compose.dev.yml launch: docker/docker-compose.yml -providers: - # you can mix and match many files - dotenv: - env_sync: - path: .env-dist - vault: - env_sync: - path: environment/data/billing/web/env - env: - SMTP_PASS: - path: environment/data/billing/global - field: SMTP \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..67fd379 --- /dev/null +++ b/Dockerfile @@ -0,0 +1 @@ +FROM alpine diff --git a/app/cmd/docker.go b/app/cmd/docker.go index 6ed9520..6957cd9 100644 --- a/app/cmd/docker.go +++ b/app/cmd/docker.go @@ -1,9 +1,8 @@ package cmd import ( - "ledo/app/cmd/docker" - "github.com/urfave/cli/v2" + "ledo/app/cmd/docker" ) var CmdDocker = cli.Command{ @@ -12,10 +11,8 @@ var CmdDocker = cli.Command{ Category: catHelpers, Usage: "docker helper", Description: `Manage docker-compose in project`, - Action: runDockerDefault, Subcommands: []*cli.Command{ &docker.CmdDockerPs, - &docker.CmdDockerFqn, &docker.CmdDockerUp, &docker.CmdComposeBuild, &docker.CmdComposeDebug, @@ -31,7 +28,3 @@ var CmdDocker = cli.Command{ &docker.CmdDockerLogin, }, } - -func runDockerDefault(ctx *cli.Context) error { - return docker.RunComposePs(ctx) -} diff --git a/app/cmd/image.go b/app/cmd/image.go new file mode 100644 index 0000000..d7803a9 --- /dev/null +++ b/app/cmd/image.go @@ -0,0 +1,23 @@ +package cmd + +import ( + "ledo/app/cmd/image" + + "github.com/urfave/cli/v2" +) + +var CmdImage = cli.Command{ + Name: "image", + Aliases: []string{"i"}, + Category: catHelpers, + Usage: "docker container helper", + Description: `docker container helper`, + Subcommands: []*cli.Command{ + &image.CmdDockerFqn, + &image.CmdDockerPush, + &image.CmdDockerRetag, + &image.CmdDockerBuild, + }, +} + + diff --git a/app/cmd/image/build.go b/app/cmd/image/build.go new file mode 100644 index 0000000..64843a2 --- /dev/null +++ b/app/cmd/image/build.go @@ -0,0 +1,45 @@ +package image + +import ( + "github.com/urfave/cli/v2" + "ledo/app/modules/context" + "ledo/app/modules/docker" +) + +var CmdDockerBuild = cli.Command{ + Name: "build", + Aliases: []string{"b"}, + Usage: "build docker image", + Description: `Build docker image`, + ArgsUsage: "version", + Action: RunDockerBuild, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "stage", + Aliases: []string{"s"}, + Value: "", + Usage: "select stage to build (multi-stage dockerfile)", + Required: false, + }, + &cli.StringFlag{ + Name: "dockerfile", + Aliases: []string{"f"}, + Value: "./Dockerfile", + Usage: "select dockerfile", + Required: false, + }, + &cli.StringFlag{ + Name: "opts", + Aliases: []string{"o"}, + Value: "--compress", + Usage: "Additional build options", + Required: false, + }, + }, +} + +func RunDockerBuild(cmd *cli.Context) error { + ctx := context.InitCommand(cmd) + docker.ExecDockerBuild(ctx, cmd.Args(), *cmd) + return nil +} diff --git a/app/cmd/docker/fqn.go b/app/cmd/image/fqn.go similarity index 80% rename from app/cmd/docker/fqn.go rename to app/cmd/image/fqn.go index 87afdd5..57155c3 100644 --- a/app/cmd/docker/fqn.go +++ b/app/cmd/image/fqn.go @@ -1,9 +1,9 @@ -package docker +package image import ( "fmt" "github.com/urfave/cli/v2" - "ledo/app/modules/compose" + "ledo/app/modules/docker" "ledo/app/modules/context" ) @@ -17,6 +17,6 @@ var CmdDockerFqn = cli.Command{ func RunDockerFqn(cmd *cli.Context) error { ctx := context.InitCommand(cmd) - fmt.Printf("%v", compose.ShowDockerImageFQN(ctx)) + fmt.Printf("%v", docker.ShowDockerImageFQN(ctx)) return nil } diff --git a/app/cmd/image/push.go b/app/cmd/image/push.go new file mode 100644 index 0000000..710ff27 --- /dev/null +++ b/app/cmd/image/push.go @@ -0,0 +1,22 @@ +package image + +import ( + "github.com/urfave/cli/v2" + "ledo/app/modules/context" + "ledo/app/modules/docker" +) + +var CmdDockerPush = cli.Command{ + Name: "push", + Aliases: []string{"p"}, + Usage: "push docker to registry", + Description: `Push docker image to docker registry`, + ArgsUsage: "version", + Action: RunDockerPush, +} + +func RunDockerPush(cmd *cli.Context) error { + ctx := context.InitCommand(cmd) + docker.ExecDockerPush(ctx, cmd.Args()) + return nil +} diff --git a/app/cmd/image/retag.go b/app/cmd/image/retag.go new file mode 100644 index 0000000..d3e5249 --- /dev/null +++ b/app/cmd/image/retag.go @@ -0,0 +1,22 @@ +package image + +import ( + "github.com/urfave/cli/v2" + "ledo/app/modules/context" + "ledo/app/modules/docker" +) + +var CmdDockerRetag = cli.Command{ + Name: "retag", + Aliases: []string{"r"}, + Usage: "retag docker image", + Description: `Change docker image tag`, + ArgsUsage: "fromTag toTag", + Action: RunDockerRetag, +} + +func RunDockerRetag(cmd *cli.Context) error { + ctx := context.InitCommand(cmd) + docker.ExecDockerRetag(ctx, cmd.Args()) + return nil +} diff --git a/app/cmd/init.go b/app/cmd/init.go index c034e35..d5f18cd 100644 --- a/app/cmd/init.go +++ b/app/cmd/init.go @@ -15,7 +15,6 @@ import ( var CmdInit = cli.Command{ Name: "init", - Aliases: []string{"i"}, Category: catSetup, Usage: "Init ledo in project", Description: `Initialize LeadDocker in current project`, diff --git a/app/modules/compose/compose.go b/app/modules/compose/compose.go index 94c70cb..dab8869 100644 --- a/app/modules/compose/compose.go +++ b/app/modules/compose/compose.go @@ -3,7 +3,6 @@ package compose import ( "bytes" "errors" - "fmt" "github.com/Masterminds/semver" "github.com/urfave/cli/v2" "gopkg.in/yaml.v3" @@ -78,11 +77,6 @@ func MergeComposerFiles(filenames ...string) (string, error) { return string(bs), nil } -func ShowDockerImageFQN(ctx *context.LedoContext) string { - fqn := fmt.Sprintf("%s/%s/%s/master", ctx.Config.Docker.Registry, ctx.Config.Docker.Namespace, ctx.Config.Docker.Name) - return strings.ToLower(fqn) -} - func ExecComposerUp(ctx *context.LedoContext) { args := ctx.ComposeArgs args = append(args, "up", "-d") diff --git a/app/modules/docker/docker.go b/app/modules/docker/docker.go new file mode 100644 index 0000000..0f8c04a --- /dev/null +++ b/app/modules/docker/docker.go @@ -0,0 +1,95 @@ +package docker + +import ( + b64 "encoding/base64" + "fmt" + "github.com/urfave/cli/v2" + "ledo/app/modules/aws_ledo" + "ledo/app/modules/context" + "net/url" + "os" + "strings" +) + +func trimLeftChars(s string, n int) string { + m := 0 + for i := range s { + if m >= n { + return s[i:] + } + m++ + } + return s[:0] +} + +func DockerEcrLogin(ctx *context.LedoContext) error { + ecr, err := aws_ledo.EcrLogin() + if err != nil { + fmt.Println("Ecr login error: %s", err) + os.Exit(1) + } + password := *ecr.AuthorizationData[0].AuthorizationToken + ecrUrl := *ecr.AuthorizationData[0].ProxyEndpoint + sDec, _ := b64.StdEncoding.DecodeString(password) + registryAddr, err := url.Parse(ecrUrl) + if err != nil { + fmt.Printf("Ecr endpoint addr parse error: %s", err) + os.Exit(1) + } + ctx.ExecCmdSilent("docker", []string{"login", "-u", "AWS", "-p", string(trimLeftChars(string(sDec), 4)), registryAddr.Host}) + + return nil +} + +func ShowDockerImageFQN(ctx *context.LedoContext) string { + fqn := fmt.Sprintf("%s/%s/%s", ctx.Config.Docker.Registry, ctx.Config.Docker.Namespace, ctx.Config.Docker.Name) + return strings.ToLower(fqn) +} + +func ExecDockerPush(ctx *context.LedoContext, command cli.Args) { + var version string + var args []string + if command.First() == "" { + version = "latest" + } else { + version = command.First() + } + image := ShowDockerImageFQN(ctx) + args = append(args, "push") + args = append(args, "-f", image + ":" + version) + ctx.ExecCmd("docker", args[0:]) +} + +func ExecDockerRetag(ctx *context.LedoContext, command cli.Args) { + var args []string + + from := command.Get(0) + to := command.Get(1) + image := ShowDockerImageFQN(ctx) + args = append(args, "tag") + args = append(args, image + ":" + from) + args = append(args, image + ":" + to) + ctx.ExecCmd("docker", args[0:]) +} + +func ExecDockerBuild(ctx *context.LedoContext, command cli.Args, cmdCtx cli.Context) { + var version string + var args []string + if command.First() == "" { + version = "latest" + } else { + version = command.First() + } + + opts := strings.Split(strings.Trim(cmdCtx.String("opts"), " "), " ") + image := ShowDockerImageFQN(ctx) + args = append(args, "build") + args = append(args, "-t", image+":"+version) + args = append(args, "-f", cmdCtx.String("dockerfile")) + args = append(args, opts...) + if cmdCtx.String("stage") != "" { + args = append(args, "--target", cmdCtx.String("stage")) + } + args = append(args, ".") + ctx.ExecCmd("docker", args[0:]) +} \ No newline at end of file diff --git a/app/modules/docker/login.go b/app/modules/docker/login.go deleted file mode 100644 index b200eaf..0000000 --- a/app/modules/docker/login.go +++ /dev/null @@ -1,40 +0,0 @@ -package docker - -import ( - b64 "encoding/base64" - "fmt" - "ledo/app/modules/aws_ledo" - "ledo/app/modules/context" - "net/url" - "os" -) - -func trimLeftChars(s string, n int) string { - m := 0 - for i := range s { - if m >= n { - return s[i:] - } - m++ - } - return s[:0] -} - -func DockerEcrLogin(ctx *context.LedoContext) error { - ecr, err := aws_ledo.EcrLogin() - if err != nil { - fmt.Println("Ecr login error: %s", err) - os.Exit(1) - } - password := *ecr.AuthorizationData[0].AuthorizationToken - ecrUrl := *ecr.AuthorizationData[0].ProxyEndpoint - sDec, _ := b64.StdEncoding.DecodeString(password) - registryAddr, err := url.Parse(ecrUrl) - if err != nil { - fmt.Printf("Ecr endpoint addr parse error: %s", err) - os.Exit(1) - } - ctx.ExecCmdSilent("docker", []string{"login", "-u", "AWS", "-p", string(trimLeftChars(string(sDec), 4)), registryAddr.Host}) - - return nil -} diff --git a/main.go b/main.go index 3db51b7..dd7a5ee 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,7 @@ func main() { app.Commands = []*cli.Command{ &cmd.CmdInit, &cmd.CmdDocker, + &cmd.CmdImage, &cmd.CmdMode, &cmd.CmdAutocomplete, // &CmdSelfupdate,