ローカルのコンテナ内でdockerのイメージをビルドしてECRにプッシュ
CodeBuildのように、amazonlinuxイメージを使用したコンテナ内でイメージをビルドし、ECRにプッシュできることを確かめます。ディレクトリ構造は以下の通りです。
ディレクトリ構造
.
├── Dockerfile
└── SpringBootProject
├── Dockerfile
├── build
├── build.gradle
├── gradle
├── build.sh
├── gradlew
├── settings.gradle
└── src
まずはSpringBootProjectをビルドするamazonlinuxのDockerfileです。
Dockerfile
FROM amazonlinux
#AWSCLIのインストール
RUN ["yum","install","-y","unzip"]
RUN ["curl","https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip","-o","awscliv2.zip"]
RUN ["unzip","awscliv2.zip"]
RUN ["/aws/install"]
#dockerのインストール
RUN amazon-linux-extras install -y docker
#プロジェクトディレクトリをコピー
COPY ./SpringBootProject/ /SpringBootProject
#ビルドスクリプトの実行
CMD cd SpringBootProject && ./build.sh
以下はbuild.shです。
build.sh
#!/bin/bash
#AWSの認証情報を環境変数に設定
export AWS_DEFAULT_OUTPUT="yaml"
export AWS_CLI_FILE_ENCODING=UTF-8
export AWS_ACCESS_KEY_ID=#your_access_key_id
export AWS_SECRET_ACCESS_KEY=#your_secret_access_key
export AWS_DEFAULT_REGION=ap-northeast-1
aws sts get-caller-identity --no-paginate --no-cli-pager
#gradleを使う為、JAVA_HOMEを設定
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.amzn2.0.1.x86_64
#ビルド
/SpringBootProject/gradlew build
#ECRにプッシュ(先にレポジトリを作っておく必要があります。)
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin account_id.dkr.ecr.ap-northeast-1.amazonaws.com
docker build -t repository_name .
docker tag repository_name:latest account_id.dkr.ecr.ap-northeast-1.amazonaws.com/repository_name:latest
docker push account_id.dkr.ecr.ap-northeast-1.amazonaws.com/repository_name:latest
SpringBootProjectディレクトリ内のDockerfileです。
Dockerfile
FROM amazonlinux
RUN yum install -y java-1.8.0-openjdk-devel.x86_64
COPY /build/libs/SpringBootProject.jar /
コンテナ起動
コンテナ内でDockerを使うことになる為、docker.sockをマウントする必要があります。
イメージビルド&コンテナ起動
docker build . -t backend
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti backend
本編
実際にCodeBuildでECRにイメージをプッシュしています。