🌸

RenderにSpringをデプロイする

2022/11/26に公開

調べていてあまり情報がなかったので簡単ですが備忘も兼ねて書いておきます。
Zennはじめましてです、よろしくお願いします。

Renderのページはこちら。
https://render.com/

先に結論

以下のようなDockerfileを既存のプロジェクトのルートディレクトリに配置してRender側でWeb ServiceでServiceを作成すればデプロイされます。

FROM amazoncorretto:17 AS build
COPY ./ /home/app
RUN cd /home/app && ./gradlew build

FROM amazoncorretto:17-alpine
COPY --from=build /home/app/build/libs/spring-render-deploy-0.0.1-SNAPSHOT.jar /usr/local/lib/spring-render-deploy.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","-Dfile.encoding=UTF-8","/usr/local/lib/spring-render-deploy.jar"]

以下から、1からシンプルなプロジェクトを作成してデプロイしてきます。

Spring Initializrでプロジェクトを作る

Spring Initializr
以上の画像のように設定をしてInitializeします。Group、Name、Description等はもちろん自由に設定してかまいません。

以下のURLにアクセスすれば画像と同じ設定を読み込めるはずです。
https://start.spring.io/#!type=gradle-project-kotlin&language=kotlin&platformVersion=2.7.6&packaging=jar&jvmVersion=17&groupId=com.example&artifactId=spring-render-deploy&name=spring-render-deploy&description=Simple example deploy Spring on Render.&packageName=com.example.spring-render-deploy&dependencies=web

次に、動作確認のためにシンプルなControllerを1つ作成しておきます。
src/main/kotlin/com/example/springrenderdeploy/controller/HelloController.kt を作成します。pathは適宜読みかえてください。

package com.example.springrenderdeploy.controller

import org.springframework.ui.Model
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController


@RestController
class HelloController {
    @GetMapping(path = ["/"])
    fun hello(model: Model): String {
        return "hello!"
    }
}

起動して http://localhost:8080/ にアクセスすると hello! が表示されていればOKです。

ここまでのファイルをGitHubのRepositoryにpushしておきます。

RenderでWeb Serviceを作る

以下のRenderのドキュメントを参考にWeb Service というtypeのServiceを作ります。2番のところでは先ほどのGitHubのRepositoryを選択します。
https://render.com/docs/web-services#deploy-your-own-code

Create Web Service. まで行うと自動でbuildが走りますが、以下のようなエラーでfailするはずです。最後に Dockerfile を追加します。

#2 [internal] load build definition from Dockerfile
#2 transferring dockerfile: 2B done
#2 DONE 0.0s
error: failed to solve: failed to read dockerfile: open /home/user/.local/tmp/buildkit-mount/Dockerfile: no such file or directory

Dockerfileを作る

ここで、冒頭で紹介したDockerfileをルートディレクトリに追加します。
spring-render-deploy-0.0.1-SNAPSHOT.jar の部分はbuild.gradle.ktssettings.gradle.ktsの内容によって変わります。適宜読み替えてください。

FROM amazoncorretto:17 AS build
COPY ./ /home/app
RUN cd /home/app && ./gradlew build

FROM amazoncorretto:17-alpine
COPY --from=build /home/app/build/libs/spring-render-deploy-0.0.1-SNAPSHOT.jar /usr/local/lib/spring-render-deploy.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","-Dfile.encoding=UTF-8","/usr/local/lib/spring-render-deploy.jar"]

このDockerfileをRepositoryにpushすれば自動でRender側でbuildが走ります。
少し時間がかかりますが、デプロイされるはずです
https://{RenderのWeb ServiceのName}.onrender.com にアクセスして hello! が表示されていれば成功です。

以上の手順を辿った簡単なRepositoryが以下にあるので、よければ参考にしてみてください。
https://github.com/projectormato/spring-render-deploy

Discussion