【Go, AWS】DockerfileをECRへPushする(M1)
はじめに
業務で使用して少し詰まった箇所があるので、忘備録の為に記事にします。
今回はECRへPushするところまでです。(長くなるので2つに分けました)
続きはこちら。
【Go, AWS】ECS(Fargate)でGoを動かす(M1)
Fargate起動して動作確認までやっています。
前提
Docker、ECR、ECSの概要についてはここでは説明しないので、よく分からない方は公式のドキュメントを参照してください。
環境
- go 1.17
- macOS 12.0.1
- M1チップ
手順
- ECRのリポジトリを作成する。
- 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