🧸

【Mac】DockerからECRへソースをプッシュする

2024/04/05に公開

この記事について

Dockerからプロジェクトのソースコードを、イメージとしてECRへプッシュを行う手順の記事になります。
初心者向けの内容になっています。備忘録です。

使用するサービス

  • GitLab
    • ソースコード管理ツール
  • Docker
    • コンテナ形の仮想環境構築ツール。これでAWSへソースをプッシュします。Dockerfile(構築する際の設計書ファイル)をグループ内で共有すれば、皆が簡単に同等の環境を作ることができる
  • AWS ECR
    • ソースコードが入ったプロジェクトを倉庫のように溜めておくことができるサービス。amazonが提供している

事前準備

AWS CLIインストール

コマンドでAWS操作を実行するために必要なものです
公式のインストール手順に従ってインストールします
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

マックOSのコマンドライン方式で手順通りにコマンドを実行します

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /

以下のように「The install was successful」が出ることを確認します

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 37.5M  100 37.5M    0     0  14.8M      0  0:00:02  0:00:02 --:--:-- 14.8M
Password:
installer: Package name is AWS Command Line Interface
installer: Installing at base path /
installer: The install was successful.

which awsでインストールされたかを確認します

which aws
/usr/local/bin/aws

AWSアカウント作成

こちらを参考に作成します
参考:https://www.cloudbuilders.jp/articles/438/

AWSアクセスキー取得

DockerからECRへプッシュするための認証用でアクセストークンを発行します。
AWSにサインインし、右上自分のアカウント名 > セキュリティ認証情報をクリック
スクリーンショット 2024-03-10 11.38.42.png

画面を下にスクロールして「アクセスキーを作成」をクリック
スクリーンショット 2024-03-10 11.40.30.png

rootユーザという強い権限でアクセスキーを作ることを推奨しませんと出ますが、今回は勉強用なのでこのまま進みます。チェックボックスにチェックを入れます
スクリーンショット 2024-03-10 11.41.36.png

作成されたので下のボタンから.csvファイルをダウンロードします
スクリーンショット 2024-03-10 11.43.34.png

AWS CLIにアクセスキーを設定します
以下のコマンドを実行

aws configure

対話形式が始まるので、.csvの中のKeyをそれぞれ入力します。
regionについては東京の「ap-northeast-1」、output formatは未入力で設定します

AWS Access Key ID [None]: ~
AWS Secret Access Key [None]: ~
Default region name [None]: ap-northeast-1
Default output format [None]: 未入力

aws configure listとコマンドを実行して、設定した値が表示されれば設定完了です

      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ******************** shared-credentials-file    
secret_key     ******************** shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config

Dockerインストール

わかりやすい記事があったので参考にしました
参考:
https://www.kagoya.jp/howto/cloud/container/dockerformac/

Gitアクセストークンを発行

Dockerからgit cloneする際にGitへアクセスする用のアクセストークンを発行します。
自分のアカウントは2FA(二要素認証)を有効にしているため、この作業が必要です。

左上の自分のアイコンから「プロファイルを編集」をクリック
スクリーンショット 2024-03-09 10.14.47.png

左のメニューから「アクセストークン」をクリック
スクリーンショット 2024-03-09 10.48.08.png

パーソナルアクセストークンの画面が開きます。
ここでは個人単位でのアクセス権限付与が可能です。
右側の「新しいトークンを追加」をクリック
スクリーンショット 2024-03-09 10.54.16.png

次の画面でトークン名、有効期限、スコープを選択します
トークン名:任意
有効期限:任意
スコープを選択:read_repositoryにチェック
read_repositoryでcloneする権限を与えます
スクリーンショット 2024-03-09 10.59.13.png
スクリーンショット 2024-03-09 11.02.46.png
最後に下部の「個人のアクセストークンを作成」をクリック

発行したアクセストークンをコピーして、新規ローカルファイルに貼り付けます。
スクリーンショット 2024-03-09 12.32.02.png
その際トークンの頭に「oauth2:」と入力して保存します。

AWSリポジトリ作成

ECRを開いて、左メニューのPrivate registory > Repositoriesをクリック
リポジトリがなければ作成します。
「リポジトリを作成」をクリック
スクリーンショット 2024-03-09 11.48.53.png
可視性設定:プライベート
リポジトリ名:任意
タグのイミュータビリティ:有効
他の設定は特に変更せず、下部の「リポジトリを作成」をクリック
スクリーンショット 2024-03-09 12.10.08.png

リポジトリが作成できたことを確認します
スクリーンショット 2024-03-09 12.23.16.png

実際にプッシュしてみる

  1. Dockerfileを作成する
    Gitプロジェクトからソースをクローンするよう指示を書きます
  2. Dockerfileをビルドする
  3. ビルドしたイメージにタグをつける
  4. DockerからAWSへアクセスできるようにAWS認証を行う
    アクセストークンで認証する
  5. Dockerからタグを指定してECRへプッシュする
  6. ECRにイメージがプッシュされていることを確認する。完了

Dockerfileを作成する

Dockerfileを新規作成し、以下のコードを書きます

FROM bitnami/git:latest AS GIT

ARG BRANCH

ENV APP_DIR="/app"

RUN --mount=type=secret,id=token git clone -b {BRANCH} https://(cat /run/secrets/token)@gitlab.com/xxxx/xxx $APP_DIR

やってることは、
・bitnamiが提供するgitを利用します。bitnamiとはですが、ここではとりあえず色々提供してくれるパッケージと思っておけばOKです
・作業フォルダは/app配下です
・@gitlab.com/xxxx/xxxの部分でプロジェクトのリポジトリURLを指定します
・ブランチは現ブランチを動的に指定します
・ソースをクローンします

プッシュする

ここからはコマンドラインを実行します。
Dockerfileのある場所まで移動します

cd /XX/XX

Dockerfileの内容でビルドします(XXXに適当に設定してください)

docker build -t XXX .

XXXの名前でビルドされたことを確認するため一覧で確認します

docker images

AWSのリポジトリにプッシュする際のタグ付け(別名のようなもの)をします
このタグ名でECRへプッシュします。
自分のアカウントIDは適切に設定してください

docker tag XXX:latest 自分のアカウントID.dkr.ecr.ap-southeast-2.amazonaws.com/AAA:latest

AAAをリポジトリにプッシュします

docker push 自分のアカウントID.dkr.ecr.ap-southeast-2.amazonaws.com/AAA:latest

ECRのリポジトリを確認する

ECRでプライベートリポジトリを表示して、AAAがプッシュされていることを確認します

困ったこと

Gitからクローンしてくる際に認証エラー発生

原因は、gitパーソナルトークンをローカルにファイルで保存する際に「oauth2:」をつけていなかったことでした。
こちらの記事を参考にしてエラー解消しました。
https://bitto.jp/git-https-with-personal-token/

最後に

以上がdockerからECRへソースをプッシュするフローでした。
Dockerfileを作成してしまえば、次からはソースクローンを「docker build -t XXX .」で自動でできちゃいます。
AWS認証〜ECRへプッシュも1ファイルに集約して、コマンド1つでできないかと考えてますが、タグ付けの部分でバージョン管理的な意味合い込めて毎回違うタグ名を設定したいので、できるかどうかわからないですね..
何かわかれば記事にしたいと思います!

以上

Discussion