Skip to content

実行イメージを distroless の Java 17 にする - #14

Merged
5ym merged 1 commit into
mainfrom
distroless
Oct 24, 2026
Merged

5ym merged 1 commit into
mainfrom
distroless

Conversation

@5ym

@5ym 5ym commented Oct 24, 2026

Copy link
Copy Markdown
Collaborator

なぜ

実行イメージにシェルやパッケージマネージャを置かず、攻撃面を減らすため (danything の他のアプリと同じ方針)。

変えたこと

  • 実行段: tomcat:9.0-jre17-temurin → gcr.io/distroless/java17-debian13 (Temurin 17 の JRE)。Tomcat は今までどおり公式イメージで組み立てた $CATALINA_HOME をまるごと写す。使わないもの (bin/*.sh、Tomcat Native (APR) の native-jni-lib、webapps.dist) は外した
  • 入口: docker-entrypoint.sh (sh + awk) → launcher/MospLauncher.java。DB接続設定 (connection.xml / setup.xml) を同じ規則で書き換えてから、同じ JVM で org.apache.catalina.startup.Bootstrap start を呼ぶ。catalina.sh run が組んでいた java のコマンドライン (JDK_JAVA_OPTIONS の --add-opens、-Dcatalina.*、juli のロギングなど) は動いているコンテナの /proc/1/cmdline と environ から写し、exec の形の ENTRYPOINT に書いた。SIGTERM で Tomcat はふつうに止まる
  • chart (0.3.1 → 0.4.0): initContainer copy-sql の sh -c 'cp -a …' を、イメージの入口の copy (args: [copy, /usr/local/tomcat/webapps/ROOT/sql, /mosp-sql]) に。db-bootstrap は postgres のイメージなのでそのまま。probe はもともと無い
  • ユーザは今までどおり root (起動時に WEB-INF/xml を書き換え、ログの PVC に書くため)。文字コードは LANG=C.UTF-8 (distroless の既定) で、file.encoding / sun.jnu.encoding は UTF-8 のまま。TZ は今までどおり chart から渡す
  • APR は OpenSSL の初期化にしか使われていなかった (Connector は前から http-nio-8080。TLS は Ingress で終端)。起動ログに「Tomcat Native library … was not found」の INFO が 1 行出るだけ
  • ワークフローの paths と README を launcher/** に合わせた

確かめたこと (手元で build して run)

  • イメージ: 338MB → 200MB
  • postgres:13 を立て、chart と同じ手順を通した: 新しいイメージの copy で SQL を写す (中身は元のイメージと同じ 5 ファイル) → chart の db-bootstrap のスクリプトをそのまま流す (bootstrap done) → MosP を起動
  • 元の版と新しい版を同じ環境変数で起動して、書き換え後の connection.xml / setup.xml を比べた。バイト単位で同じだった (jdbc:postgresql://host:port/db?…、\ $ / | " を含むパスワード、MOSP_DB_DRIVER も試した)
  • 初回ユーザ登録画面 (SU3000) の HTML は元の版と同じ (?var= のタイムスタンプ以外)。新しい版でユーザを登録して「新規登録しました。」→ DB に 山田|太郎|ヤマダ が入り、以後はログイン画面に戻る。ログの PVC に mosp0.log が書かれる。SEVERE も例外も無し
  • stop で Tomcat がふつうに止まる (Stopping ProtocolHandler)

気をつけること

  • イメージと chart は揃えて上げること。 古い chart (0.3.x) の copy-sql は sh を呼ぶので新しいイメージでは起動しない。新しい chart (0.4.0) の args: [copy …] は古いイメージでは動かない。image.tag の既定は latest なので、このPRをマージするとイメージ (build-and-push) と chart (publish-chart) が両方作り直される。使っている側は chart を 0.4.0 に上げてから Pod を作り直す
  • 中を覗くときはシェルが無いので kubectl debug で横にコンテナを付ける

🤖 Generated with Claude Code

https://claude.ai/code/session_01QTh6wTyvpp9FAHK1pPe2Rm

- 実行段を tomcat:9.0-jre17-temurin から gcr.io/distroless/java17-debian13 に。シェルも apt も無い。
  Tomcat は公式イメージで組み立てた $CATALINA_HOME をまるごと写す (APR・*.sh・webapps.dist は外す)
- docker-entrypoint.sh (sh + awk) を launcher/MospLauncher.java に置き換え。DB接続設定の反映を
  同じ規則で行ってから、同じ JVM で Bootstrap start を呼ぶ。catalina.sh run が組んでいた
  java のコマンドライン (JDK_JAVA_OPTIONS の --add-opens を含む) を exec の形で書いた
- chart の initContainer copy-sql は sh -c 'cp -a …' をやめ、イメージの入口の copy を使う
  (args: [copy, SRC, DST])。イメージと揃えて上げる必要があるので chart を 0.4.0 に
- ユーザは今までどおり root。LANG は C.UTF-8 (file.encoding / sun.jnu.encoding は UTF-8 のまま)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QTh6wTyvpp9FAHK1pPe2Rm
@claude

claude Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Claude finished @5ym's task in 24s —— View job


レビュー結果

実装を docker-entrypoint.sh と突き合わせて確認しました。ブロッカーとなる不具合は見つかりませんでした。 概ね問題無しです。

確認できた点:

  • setXmlValue は元の awk と同じ動作です。キーを含む行の次の1行だけを置換し、空の値は何もせず、末尾の改行は常に付きます。値をエスケープとして解釈しないので、パスワードに記号が入っても安全です。tmp に書いてから move する点も元と同じです。
  • jdbc:postgresql:// の URL 分解(host / port / db 名)と、SuperUserPassword を埋めない方針は元のスクリプトと一致しています。
  • copy は cp -a SRC/. DST/ 相当です。シンボリックリンクはそのまま写し、ディレクトリは作成します。
  • ENTRYPOINT の JVM 引数は catalina.sh run 相当で、Bootstrap start を同じ JVM で呼んでいるので SIGTERM も届きます。
  • chart と image のバージョン互換の注意は PR 本文に書かれていて適切です。

要確認 / 軽微な指摘(いずれも任意)

  1. JAVA_OPTS / CATALINA_OPTS / setenv.sh が効かなくなります。 catalina.sh を使わないためです。chart の extraEnv でこれらを渡している利用者がいると、ヒープ設定などが黙って無視されます。この chart 内に該当の使用は見当たりませんでした。代わりに JAVA_TOOL_OPTIONS(または JDK_JAVA_OPTIONS)が使えるので、README に1行足すと親切です。JDK_JAVA_OPTIONS を上書きすると --add-opens が失われる点も一緒に書くとよいです。
  2. copy の所有者の扱い(要確認)。 cp -a はルートで実行すると所有者も保つ一方、COPY_ATTRIBUTES は所有者を写しません。イメージも db-bootstrap もルートで動いているなら実害は無いはずです。db-bootstrap が postgres ユーザで読む場合は、権限ビットが保たれていることを確認してください(PR 本文の手元確認では動作済みとのことなので、念のためです)。
  3. テスト。 MospLauncher の単体テストは無く、検証は手元の手動確認のみです。上記のバイト単位の比較を CI のスモークテスト(connection.xml の書き換え結果の比較)にできると、今後の回帰を防げます。必須ではありません。

@5ym
5ym merged commit 1fe330f into main Oct 24, 2026
1 check passed
@5ym
5ym deleted the distroless branch October 24, 2026 09:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant