why
AWS の ECR にデプロイし、ECS のタスクとして動作させるため。
ECR はコンテナ・レジストリのため、Docker イメージにする必要があった。
コンテナイメージへのビルドを調査
Spring のアプリは別の記事で作った。
Docker イメージにビルドすれば docker push できると考えた。
Spring 公式を見て、Dockerfile を作成
https://spring.io/guides/topicals/spring-boot-docker/
Spring 公式を見て作る。
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
temurin の jdk17 を使い
/tmp に永続化し?
JAR_FILE を受け取り(引数で渡す)
JAR_FILE を app.jar にコピー
app.jar を実行するエントリーポイント?を決める
このように解釈した。
なぜ openJDK ではなく temurin?
Docker 公式で非推奨になっているからだった。
https://stackoverflow.com/a/70355582
openjdk もあるのはわかった。
https://hub.docker.com/_/openjdk
ただ、Docker Hub には openJDK は非推奨で、
amazon correto や temurin を使えと書いてあった。
なので temurin を使う。
Spring 公式通りに Docker イメージを作成して失敗。
Spring 公式を参考に Docker build で Docker イメージを作る
Spring 公式の引数を使ってビルドに失敗
https://spring.io/guides/topicals/spring-boot-docker/
docker build \
--build-arg JAR_FILE=target/*.jar \
-t myorg/myapp .
これでは Mac の自分の環境ではビルドできなかった。
Spring 公式ではこのコマンドでビルドできると書いてあった。
一方、下記の 2 つのエラーが出た。
Docker の並列実行がエラーになる
dockerfile.v0: failed to create LLB definition
この takkeybook さんの記事を参考に
export DOCKER_BUILDKIT=0
export COMPOSE_DOCKER_CLI_BUILD=0
.zshrc に上記の設定を追記して zsh を再起動したら解決した。
これは Docker の並列実行の設定を OFF にしている。
Linux/arm64 でビルドされていないエラー
次にビルドする Docker イメージが Mac のコアのアーキテクチャと違うエラーが出た。
no matching manifest for linux/arm64 in the manifest list entries
https://qiita.com/jizya/items/38f15271903de629d1ab#%E3%82%A8%E3%83%A9%E3%83%BC%E5%86%85%E5%AE%B9
これらの 記事を参考にして
--platform=linux/amd64
これを docker ビルド時に追加すると、上記のエラーが消えた。
改善を加えて実際に動作を確認
実際に動かすために必要だったファイルとコマンドたち
プロジェクト名は spring302
Dockerfile
FROM eclipse-temurin:17-jdk-alpine
VOLUME /tmp
COPY build/libs/spring302-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
イメージのビルドコマンド
docker build -t spring302 .
イメージの実行コマンド
docker run -p 8080:8080 spring302
このコマンドで実際に動かすことができた。
-t とは?
この記事によると、-t の引数は
-t {DockerHub のユーザー名}/イメージ名:タグ名
になっていて、ユーザー名とタグ名はオプショナルだ。
動作の詳細
docker build -t spring302 .
Sending build context to Docker daemon 24.91MB
Step 1/4 : FROM eclipse-temurin:17-jdk-alpine
---> ce2d65591ecf
Step 2/4 : VOLUME /tmp
---> Using cache
---> 2bb51666c4a9
Step 3/4 : COPY build/libs/spring302-0.0.1-SNAPSHOT.jar app.jar
---> 3b3b9921a589
Step 4/4 : ENTRYPOINT ["java","-jar","/app.jar"]
---> [Warning] The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
---> Running in 413b5bbec2fe
Removing intermediate container 413b5bbec2fe
---> 67cbf2faa084
Successfully built 67cbf2faa084
Successfully tagged spring302:latest
Dockerfile に従ってビルドが成功。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
spring302 latest 67cbf2faa084 14 seconds ago 382MB
イメージが生成されている。
docker run -p 8080:8080 spring302
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.0.2)
Started Spring302ApplicationKt in 14.871 seconds
イメージから起動できる。
まとめ
MacOS を使って Spring アプリを Docker イメージにして実行する。
そのためには
- zshrc などで Docker の並列ビルドを無効化
- COPY する jar ファイルとして、build/...SNAPSHOT.jar を指定
- docker build して docker run する
これらの手順で実行できる。
今後
コンテナ化が完了したので、ECR にデプロイする。
Top comments (0)