ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【AWS】Amazon ECR を使ってみました

Amazon ECR を使ってみたのでここにメモします。

Amazon ECR とは

Elastic Container Registry の略で、Dockerのコンテナイメージを保存しておくためのレジストリです。
Docker コンテナイメージを保存・管理・デプロイを行うことができます。

特徴

  • AWS ECSと統合
  • 高可用性
  • AWS Marketplaceが活用できる
  • セキュアな状態
  • ワークフローがシンプル
  • Dockerのサポートが利用可能

Docker イメージを ECR にプッシュする流れ

事前準備

  • リポジトリを作成
  • プッシュコマンドの確認(イメージタグ, URI, リポジトリ)

ECR のコンソールからリポジトリを作成します。
リポジトリとは、Docker イメージを保存する場所となるものです。これがないとイメージを保存できないので先に作っておきます。

処理の流れ

".env" に環境変数を設定

レジストリの認証

Docker クライアントはリポジトリを管理しているECRのレジストリから認証を得る必要があります。
(認証トークンは12時間有効)

$ aws ecr get-login-password --region ${AWS_ECR_REGION_NAME} | \
		docker login --username AWS --password-stdin ${AWS_ECR_IMAGE_URI}

Login Succeeded

[ Login Succeeded ] と表示されれば認証成功です。

イメージの作成

イメージを作成します。

$ docker build -t ${AWS_ECR_REPOSITORY_NAME} .
イメージにタグ付け

コマンドの引数の内容は docker tag {{元のリポジトリ名}}:{{元のタグ名}} {{変更後のリポジトリ名}}:{{変更後のタグ名}}となります。

$ docker tag ${AWS_ECR_REPOSITORY_NAME}:latest ${AWS_ECR_IMAGE_URI_LATEST}
イメージプッシュ

イメージをプッシュします。

$ docker push ${AWS_ECR_IMAGE_URI_LATEST}

make ファイル作成

何度も実行するのが大変なので、ECRへのイメージのプッシュ用に make ファイルを作成してみました。
(.env に環境変数を設定)

MAKE=make --no-print-directory
SHELL=/bin/bash
.SHELLFLAGS = -o pipefail -c

include .env
export $(shell cat .env | tr -d '"' | sed 's/=.*//')

UID := $(shell id -u)
GID := $(shell id -g)

# 内部変数
DOCKER_RUN=docker run --rm -u "${UID}" -v `pwd`:/mnt -e "TZ=Asia/Tokyo" -w /mnt --env-file .env "${AWS_ECR_REPOSITORY_NAME}"


.PHONY: run
run: build .local_env
	@${DOCKER_RUN} python src/sample.py

.PHONY: clear
clear:
	@docker system prune -a

.PHONY: login
login:
	aws ecr get-login-password --region ${AWS_ECR_REGION_NAME} | \
		docker login --username AWS --password-stdin ${AWS_ECR_IMAGE_URI}

.PHONY: build
build: .env
	@docker build -t ${AWS_ECR_REPOSITORY_NAME} .

.PHONY: tag
tag:
	@docker tag ${AWS_ECR_REPOSITORY_NAME}:latest ${AWS_ECR_IMAGE_URI_LATEST}

.PHONY: push
push: .env
	@make clear
	@make build
	@make tag
	@docker push ${AWS_ECR_IMAGE_URI_LATEST}

実行

$ make login
$ make push