From 421018b42963d83f56b675debf70df292be95373 Mon Sep 17 00:00:00 2001 From: luktom Date: Mon, 6 Aug 2018 09:59:14 +0200 Subject: [PATCH 1/5] Add Dockerfile --- Dockerfile | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..fa121c5c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM golang:alpine as builder + +RUN apk update \ + && apk add git curl \ + && apk add ca-certificates + +RUN adduser -D -g '' user + +COPY . $GOPATH/src/github.com/tomaszkiewicz/docker-copy-docker-image +WORKDIR $GOPATH/src/github.com/tomaszkiewicz/docker-copy-docker-image + +RUN go get -u github.com/kardianos/govendor \ + && export GO_VERSION=$(go version | cut -d' ' -f3 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+') \ + && govendor sync + +RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags="-w -s" -o /main + +FROM scratch + +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ +COPY --from=builder /etc/passwd /etc/passwd + +COPY --from=builder /main /main + +USER user +ENTRYPOINT ["/main"] \ No newline at end of file From 0f3fe0ab1884465670f05a6daa6fd3d745672cf7 Mon Sep 17 00:00:00 2001 From: luktom Date: Mon, 6 Aug 2018 13:42:13 +0200 Subject: [PATCH 2/5] Change docker image to alpine to enable running in Jenkins on K8S clusters --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index fa121c5c..84a54349 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ RUN go get -u github.com/kardianos/govendor \ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags="-w -s" -o /main -FROM scratch +FROM alpine COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=builder /etc/passwd /etc/passwd From f8830ac8b5af1fa40a2607e442d78caf6f100036 Mon Sep 17 00:00:00 2001 From: luktom Date: Mon, 6 Aug 2018 14:00:19 +0200 Subject: [PATCH 3/5] Set UID for user --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 84a54349..ed295317 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ RUN apk update \ && apk add git curl \ && apk add ca-certificates -RUN adduser -D -g '' user +RUN adduser --uid 10000 -D -g '' user COPY . $GOPATH/src/github.com/tomaszkiewicz/docker-copy-docker-image WORKDIR $GOPATH/src/github.com/tomaszkiewicz/docker-copy-docker-image From 104ddc6617b9755606912227820dcdd1d5e64808 Mon Sep 17 00:00:00 2001 From: luktom Date: Mon, 6 Aug 2018 15:20:11 +0200 Subject: [PATCH 4/5] Parse full ECR url to support working without AWS config file --- main.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index aece8987..7f5bd30d 100644 --- a/main.go +++ b/main.go @@ -27,6 +27,7 @@ import ( "io/ioutil" "os" "strings" + "regexp" ) func moveLayerUsingFile(srcHub *registry.Registry, destHub *registry.Registry, srcRepo string, destRepo string, layer schema1.FSLayer, file *os.File) error { @@ -119,10 +120,15 @@ func connectToRegistry(args RepositoryArguments) (*registry.Registry, error) { username := "" password := "" - if strings.HasPrefix(url, "ecr:") { - registryId := strings.TrimPrefix(url, "ecr:") + r, _ := regexp.Compile(`(?P[0-9]{12})\.dkr\.ecr\.(?P[\w\d-]+)\.amazonaws\.com`) + r2 := r.FindAllStringSubmatch(url, -1) + + if r2 != nil { + registryId := r2[0][1] + region := r2[0][2] + + sess, err := session.NewSession(&aws.Config{Region: aws.String(region)}) - sess, err := session.NewSession() if err != nil { return nil, fmt.Errorf("Failed to create new AWS SDK session. %v", err) } From 16d2a6d7df6704e39bb28e9b41c0ebe38f949fa0 Mon Sep 17 00:00:00 2001 From: luktom Date: Tue, 7 Aug 2018 11:05:18 +0200 Subject: [PATCH 5/5] Fix manifest for destination repository (didn't work on ECR) --- main.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 7f5bd30d..ddcb9474 100644 --- a/main.go +++ b/main.go @@ -237,7 +237,13 @@ func main() { } } - err = destHub.PutManifest(*destArgs.Repository, *destArgs.Tag, manifest) + destManifest := &schema1.SignedManifest{ + Manifest: manifest.Manifest, + } + + destManifest.Manifest.Name = *destArgs.Repository + + err = destHub.PutManifest(*destArgs.Repository, *destArgs.Tag, destManifest) if err != nil { fmt.Printf("Failed to upload manifest to %s/%s:%s. %v", destHub.URL, *destArgs.Repository, *destArgs.Tag, err) exitCode = -1