以下の内容で、ドッカーイメージを構築し、ローカルで動作確認後、ECRのリポジトリにイメージをプッシュする。
変更履歴
2024/10/31: シンプルな処理内容に修正
2024/11/03: ログイン認証する行を追記
こんな感じの内容
作成するイメージ名: simple_lambda_function
コンテナ名: simple_container
タグ名: 今日の日付+イメージ名
Lamda関数名: simple_function
テストに用いるデータ: json形式
前準備:
・ECRにsimple_lambda_functionのリポジトリを作成する。
テストデータ:
{"input": "Are you Okay"}
Windows上のWSLで実行可能なシェルスクリプトの用意
#/bin/bash
# あなたのAWSアカウントID
export AWS_ACCOUNT_ID='012345678910'
# リポジトリ名
export REPOGITORY_NAME='simple_lambda_function'
# コンテナ名
export CONTAINER_NAME='simple_container'
# リージョン
export REGION='ap-northeast-1'
# ドッカーデスクトップのホスト側のポート
export HOST_OS_LOCAL_PORT_NUMBER=10000
# ドッカー内のポート
export DOCKER_CONTAINER_PORT_NUMBER='8080'
set -e
echo "#################### START #####################"
aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com
# docker イメージビルド
echo "#################### Image Build & Container run. #####################"
docker build --provenance=false -t $REPOGITORY_NAME . || exit
docker container run --rm -d --name $CONTAINER_NAME -p $HOST_OS_LOCAL_PORT_NUMBER:$DOCKER_CONTAINER_PORT_NUMBER $REPOGITORY_NAME || exit
if docker ps | grep $CONTAINER_NAME; then
echo "#################### invoke test ######################"
curl -d '{"input": "are you ok?"}' http://localhost:$HOST_OS_LOCAL_PORT_NUMBER/2015-03-31/functions/function/invocations || exit
# テストコンテナの停止
echo ""
echo "#################### docker stop ######################"
docker stop $CONTAINER_NAME 2>&1
else
echo is not running $CONTAINER_NAME
exit
fi
# タグ付け
echo "#################### docker tag ######################"
docker tag $REPOGITORY_NAME:latest $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$REPOGITORY_NAME:latest 2>&1
# リポジトリにプッシュ
echo "#################### docker push ######################"
docker push $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$REPOGITORY_NAME:latest 2>&1
実行結果:
@DESKTOP-LAPTOPS:/mnt/c/repos/simple_lambda_function$ bash docker2ECR.sh
#################### START #####################
[+] Building 1.0s (7/7) FINISHED docker:default
=> [internal] load build definition from dockerfile
...
#################### docker build Okay!!!####################
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
#################### docker run Okay!!!####################
6c20cfd9c4bb simple_lambda_function "/lambda-entrypoint.…" Less than a second ago Up Less than a second 0.0.0.0:10000->8080/tcp simple_container
#################### invoke test ######################
{"statusCode": 200, "body": "recieved_message: Are you Okay?"}
#################### docker stop ######################
simple_container
#################### docker tag ######################
#################### docker push ######################
The push refers to repository [■■■■■■■■■■■■■■.dkr.ecr.ap-northeast-1.amazonaws.com/■■■■■■■■■■■■■■■]
bf922ea61555: Layer already exists
c863ffdfd2d1: Layer already exists
5d7c9b87d3ce: Layer already exists
c5a7082ff81e: Layer already exists
ac6e3c517a18: Layer already exists
35e8cd243a50: Layer already exists
33be6fae4e71: Layer already exists
latest: digest: sha256:■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ size: 1683
以下の記事を参考にしました.
参考: