docker ECR login (go-aws-sdk)
This commit is contained in:
@ -28,6 +28,7 @@ var CmdDocker = cli.Command{
|
||||
&docker.CmdComposeUpOnce,
|
||||
&docker.CmdComposePull,
|
||||
&docker.CmdComposeStop,
|
||||
&docker.CmdDockerLogin,
|
||||
},
|
||||
}
|
||||
|
||||
|
32
app/cmd/docker/login.go
Normal file
32
app/cmd/docker/login.go
Normal file
@ -0,0 +1,32 @@
|
||||
package docker
|
||||
|
||||
import (
|
||||
"github.com/urfave/cli/v2"
|
||||
"ledo/app/modules/context"
|
||||
"ledo/app/modules/docker"
|
||||
)
|
||||
|
||||
var CmdDockerLogin = cli.Command{
|
||||
Name: "login",
|
||||
Aliases: []string{"l"},
|
||||
Usage: "Docker Registry login",
|
||||
Description: `Login to docker registry`,
|
||||
Subcommands: []*cli.Command{
|
||||
&CmdDockerEcrLogin,
|
||||
},
|
||||
}
|
||||
|
||||
var CmdDockerEcrLogin = cli.Command{
|
||||
Name: "ecr",
|
||||
Aliases: []string{"e"},
|
||||
Usage: "AWS Elastic Docker Registry",
|
||||
Description: `Login to docker registry`,
|
||||
Action: RunDockerEcrLogin,
|
||||
}
|
||||
|
||||
func RunDockerEcrLogin(cmd *cli.Context) error {
|
||||
ctx := context.InitCommand(cmd)
|
||||
docker.DockerEcrLogin(ctx)
|
||||
return nil
|
||||
}
|
||||
|
36
app/modules/aws_ledo/ecr_login.go
Normal file
36
app/modules/aws_ledo/ecr_login.go
Normal file
@ -0,0 +1,36 @@
|
||||
package aws_ledo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go/service/ecr"
|
||||
"os"
|
||||
)
|
||||
|
||||
func getRegion() string {
|
||||
region, exists := os.LookupEnv("AWS_REGION")
|
||||
if !exists {
|
||||
fmt.Printf("AWS_REGION not set and unable to fetch region")
|
||||
os.Exit(1)
|
||||
}
|
||||
return region
|
||||
}
|
||||
|
||||
func EcrLogin() (*ecr.GetAuthorizationTokenOutput, error) {
|
||||
var input *ecr.GetAuthorizationTokenInput
|
||||
var token *ecr.GetAuthorizationTokenOutput
|
||||
|
||||
config := &aws.Config{
|
||||
Region: aws.String(getRegion()),
|
||||
}
|
||||
sess, _ := session.NewSession(config)
|
||||
_, err := sess.Config.Credentials.Get()
|
||||
if err != nil {
|
||||
return token, err
|
||||
}
|
||||
|
||||
ecrCtx := ecr.New(sess)
|
||||
token, err = ecrCtx.GetAuthorizationToken(input)
|
||||
return token, nil
|
||||
}
|
@ -81,3 +81,11 @@ func (lx *LedoContext) ExecCmd(cmd string, cmdArgs []string) error {
|
||||
command.Stderr = os.Stderr
|
||||
return command.Run()
|
||||
}
|
||||
|
||||
func (lx *LedoContext) ExecCmdSilent(cmd string, cmdArgs []string) error {
|
||||
command := exec.Command(cmd, cmdArgs...)
|
||||
command.Stdin = os.Stdin
|
||||
command.Stdout = os.Stdout
|
||||
command.Stderr = os.Stderr
|
||||
return command.Run()
|
||||
}
|
||||
|
40
app/modules/docker/login.go
Normal file
40
app/modules/docker/login.go
Normal file
@ -0,0 +1,40 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user