メモ ECR ローカルMacからAWS CLIコマンドでリポジトリ作成/イメージpush/リポジトリ削除まで


## やること
- ローカルのMacからAWS CLIでECRにリポジトリを作成し、ビルドしたdocker imageをpush
- AWSマネジメントコンソールでpushされたイメージ確認
- AWS CLIでイメージの削除、リポジトリの削除

基本的にやってることは[Amazon ECRにおけるdockerの基本](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-basics.html)と同じ
DockerHubとGoogleCloud Container Registryにしかイメージ上げたことなかったのでECRにも上げてみる

## 環境
- Mac
- Dockerインストール済み
- aws cli使える(configureまで済ませてある)
- AWSマネジメントコンソールにログインできる


## 作業

### AWSマネジメントコンソールにログイン
まずはAWSコンソールにログインしてECSと検索する
左側にAmazon ECR リポジトリという項目があるので遷移
作ったリポジトリ一覧が表示されるか空の状態になってる

### ローカルからAWS CLIでリポジトリを作成する
おもむろにコマンドをキメる

```
aws ecr create-repository --region リージョン --repository-name リポジトリ名
```

リージョンが東京でいいなら`ap-northeast-1`にする

今回は10秒毎にechoを繰り返すalpineイメージをpushするのでリポジトリ名は`echoalpine`とした

```
aws ecr create-repository --region ap-northeast-1 --repository-name echoalpine
```

AWSコンソールから確認してリポジトリが作成されていればOK

### ECRにpushするdockerイメージのビルド (ただpullしたのでもok)

ここはわざわざビルドしなくても`docker pull alpine`とかで取得したイメージをpushしてもいいけれど`echoalpine`という名前なのでビルドする

適当にechoalpine イメージ用のディレクトリを作成してその中に`Dockerfile`と`echo.sh`というファイルを作成する

```sh
mkdir echoalpine
cd echoalpine
touch Dockerfile
touch echo.sh
```

```dockerfile:Dockerfile
FROM alpine:3.9.3

ADD ./echo.sh /tmp/echo.sh

CMD /tmp/echo.sh
```

```sh:echo.sh
#!/bin/ash

count=0
while true
do
    echo "my echoalpine container!! 1.0.0"
    sleep 10
    count=$(expr $count + 1)
    if [ $count -ge 10 ]; then
      echo "kiss of death..."
      exit
    fi
done
```

ビルドする

```
docker build -t echoalpine ./
```

動作確認(10回echoして終了、後のECS再起動確認のため)

```
docker run --rm -it --name echoalpine echoalpine
```

### ECRにpushするイメージのタグ付け
先程作成したイメージもしくはpullしたイメージをECRのリポジトリにpushするためにtag付けする
形式は以下

```
docker tag ターゲットイメージ:タグ AWSアカウントID.dkr.ecr.ECRのリージョン.amazonaws.com/ECRリポジトリ名:ECRリポジトリに登録するタグ
```

echoalpineをタグ付けしたコマンドはこれ
AWSアカウントIDは適宜変更

```
docker tag echoalpine:latest xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echoalpine:1.0.0
```

### タグ付けしたイメージをリポジトリにpush

まずはECRへのpush権限をdockerに与えるためにawsコマンドを実行

```
aws ecr get-login --region リージョン --no-include-email
```

```
aws ecr get-login --region ap-northeast-1 --no-include-email

> docker login -u AWS -p zzzzzzz== https://xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
```

dockerログイン用コマンドが出力されるのでそれを実行するとECRのリポジトリにpush出来るようになる
権限の有効期限は12時間らしい

先程タグ付けしたイメージをpushする

```
docker push xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echoalpine:1.0.0
```
AWSコンソールの作成したリポジトリを選択してイメージを確認すると`1.0.0`のイメージが上がっているはず

pullも出来る

```
docker pull xxxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/echoalpine:1.0.0
```


### 作成したイメージとリポジトリの削除

ECRのリポジトリはAWS CLIからだと--forceオプションを付けないと削除できない
イメージを削除してからリポジトリを削除してみる(--forceで削除しないのは誤ってリポジトリを削除しないように使わないようにしている)

イメージの削除はAWS CLIから削除できる

```
aws ecr batch-delete-image --region リージョン --repository-name リポジトリ名 --image-ids imageTag=バージョン(タグ)
```

```
aws ecr batch-delete-image --region ap-northeast-1 --repository-name echoalpine --image-ids imageTag=1.0.0
```

イメージが消えたのをコンソールから確認したらリポジトリを削除する

```
aws ecr delete-repository --region リージョン --repository-name リポジトリ名 (--force)
```

```
aws ecr delete-repository --region ap-northeast-1 --repository-name echoalpine
```

リポジトリが消えたのを確認する


## まとめ
`aws ecr get-login`でECR用の権限を得る以外いつものdockerとあまり変わらない
ECSとかCodeBuildとかで使っていきたい


## 参考
[Amazon ECRにおけるdockerの基本](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-basics.html)