Docker内のJooby(Kotlin × Gradle)をホットリロードさせながらIntelliJでRemoteDebugする


1-やること

タイトルの通り、DockerやIntellijの実行構成を含んだ全部入りリポジトリはこちら
Githubリポジトリ

2-完璧でないところ

・後述のjoobyRunを行った後、RemoteDebugを走らせないとホットリロードが動きません。
 →裏でport5005に対する接続待ちが起きてる??

・ブレークポイントで止まっている間はホットリロードが効きませんでした。

3-ポイント

・Docker内のJDKとIntelliJのJDKは合わせよう!
 →この記事ではamazoncorretto:11でそろえてます。

・docker-compose.yml: environmentに環境変数GRADLE_OPTSを指定

docker-compose.yml
version: '3'

services:
  app:
    shm_size: 4096m
    build: "./build/app"
    ports:
      - '8015:8080'
      - '5005:5005'

    volumes:
      - "./app:/app"

    environment:
      TZ: 'Asia/Tokyo'
      GRADLE_OPTS: '-Dorg.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005'

    working_dir: /app

    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    tty: true

・IntelliJにdocker-compose用の実行構成を作成

・RemoteDebug用の実行構成を作成
 Command line arguments for remote JVMの内容が先述の「GRADLE_OPTS」とイコールになるはず

・docker-composeの起動構成を実行→コンテナ内部でjoobyRun実行

コマンド実行
./gradlew joobyRun

・RemoteDebugの起動構成を実行→適当に置いたブレークポイントを通るパスにアクセス

以下にアクセス
http://localhost:8015/

ブレークポイントで止まる

ソース修正するとホットリロードが行われる
※ブレークポイントで処理停止させている場合は勿論効かないです。(重要なので二度目)

4-おわり

・dockerでローカルを汚さないかつ、IntelliJの強力なアシスト+joobyRunでのホットリロード+RemoteDebug
 LL言語並みに高速でリコンパイルされるわけでないですが、これで開発がとても楽になります。

・後述のjoobyRunを行った後、RemoteDebugを走らせないとホットリロードが動きません。
 →裏でport5005に対する接続待ちが起きてる??

回避策としてはRemoteDebugが不要な時はdocker-compose.ymlのGRADLE_OPTSをコメントアウトすれば良いです。