🐳

【Go, AWS】DockerfileをECRへPushする(M1)

2022/01/29に公開

はじめに

業務で使用して少し詰まった箇所があるので、忘備録の為に記事にします。
今回はECRへPushするところまでです。(長くなるので2つに分けました)
続きはこちら。
【Go, AWS】ECS(Fargate)でGoを動かす(M1)
Fargate起動して動作確認までやっています。

前提

Docker、ECR、ECSの概要についてはここでは説明しないので、よく分からない方は公式のドキュメントを参照してください。

環境

  • go 1.17
  • macOS 12.0.1
  • M1チップ

手順

  1. ECRのリポジトリを作成する。
  2. ECRへPushする。
    2-1.ターミナルからAWS CLIを使ってレジストリに対して Docker クライアントを認証します。
    2-2.Dockerfileをbuildする。
    2-3.ECRへPushする用にbuildしたimageにtagをつける。
    2-4.ECRへAWS CLIでPushする。

解説

手順を解説していきます。

1.ECRのリポジトリを作成する。

「リポジトリを作成」をタップします。

リポジトリ作成画面へ遷移しますので、リポジトリ名を入力し、一番下の「リポジトリを作成」ボタンをタップします。


リポジトリが作成されました。

2.ECRへPushする。

先ほど作成したECRリポジトリを選択して、「プッシュコマンドの表示」ボタンをタップします。

すると下記のようなモーダルが立ち上がるので、内容に沿って、ターミナルでコマンドを入力します。
※ただし、そのままコマンドを入力するとエラーが発生する事があります。注意点が2つあるので下記で説明します。

2-1.ターミナルからAWS CLIを使ってレジストリに対して Dockerクライアントを認証します。

モーダルのコマンドを利用します。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [ACCOUNT ID].dkr.ecr.ap-northeast-1.amazonaws.com

ここで1つ注意点があります。
上記のままコマンド入力すると、aws configのdefaultで接続しに行ってしまいます。アカウントが一つだけの人はいいですが、複数アカウントやIAMロールでAWSを利用している人はご注意ください。
私はIAMロールを使用していたので、ここでログイン出来ずに詰まりました。

ログインに失敗するとこんなエラーが出ます。

Unable to locate credentials. You can configure credentials by running "aws configure".
Error: Cannot perform an interactive login from a non TTY device

IAM Role使用している方は
--profile [configに設定しているprpfile名]のオプションを使います。
こうなります。

aws ecr get-login-password --region ap-northeast-1 --profile [prpfile名] | docker login --username AWS --password-stdin [ACCOUNT ID].dkr.ecr.ap-northeast-1.amazonaws.com

2-2.Dockerfileをbuildする。

続いてDockerfileをビルドします。

docker build -t [設定したいimageのtag名] .

ここでも1つ注意点があります。
M1の場合、--platform amd64オプションを指定する必要があります。
このオプションをつけないと、ECSで動かすときにこんなエラーが出てしまいます。

standard_init_linux.go:211: exec user process caused "exec format error

なので、M1の場合は

docker build --platform amd64 -t [設定したいimageのtag名]  .

になります。

2-3.ECRへPushする用にbuildしたimageにtagをつける。

docker tag [設定したimageのtag名]:latest [ACCOUNT ID].dkr.ecr.ap-northeast-1.amazonaws.com/[設定したimageのtag名]:latest

2-4.ECRへAWS CLIでPushする。

最後にECRへPushします。

docker push [ACCOUNT ID].dkr.ecr.ap-northeast-1.amazonaws.com/my-image:latest

Push出来たらECRのリポジトリの中にimageが表示されます。

これで成功です。

ソースコード

Dockerfile

Goだけ動かす最小限のもの


FROM golang:1.17.0-alpine3.14

WORKDIR /go/src/app

RUN apk update && apk add git

COPY main.go .

COPY go.mod .

RUN go mod tidy

CMD go run main.go

main.go

Hello World出すだけの最小限のもの

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

さいごに

ECRにPushする事自体は簡単なのですが、IAMロールとM1に少し苦しみました。
次回はこのまま、ECS(Fargate)を動かしてみます。
【Go, AWS】ECS(Fargate)でGoを動かす(M1)

参考

Discussion