run-java.sh を使用して Java アプリケーションを実行する

Java アプリケーションを実行する必要がある場合、マシン上でもコンテナー内でも、 java コマンドを実行するのが一般的な方法です。

一部の Java アプリケーションは、Spring Boot アプリケーションなど、単一の実行可能な JAR ファイルにパッケージ化されています。このような JAR ファイルの場合は java -jar /opt/app.jar 、.

その他のアプリケーションは、複数の JAR ファイルとしてパッケージ化されています。このようなディレクトリ構造の場合、 java -cp lib/* com.example.Main クラスパス (classpath) とエントリ Java クラスを指定するだけで済みます。

コンテナー イメージをビルドするとき、Dockerfile は通常、 ENTRYPOINT 実行するコマンドを指定するために 使用されますjava 。

ENTRYPOINT [ "java", "-jar", "/opt/app.jar" ]

java コンテナーの実行中は、コマンドを直接使用する 方法は柔軟ではありません。パラメーターを使用して -D 新しいシステム プロパティを追加する場合は、ENTRYPOINT Dockerfile の定義を変更する必要があります。これは、新しいイメージを作成することを意味し、使用するのに非常に不便です。

より良いアプローチは、この記事で説明されているものを使用することです run-java.shその名の通り、run-java.sh シェルスクリプトです。その役割は、Java プログラムを実行することです。スクリプトは、GitHub (fabric8io-images/run-java-sh) または Maven リポジトリ (io.fabric8:run-java-sh:1.3.8) からダウンロードできます。

基本的な使い方

java このスクリプトの特徴は、コマンドを呼び出すときに環境変数を使用してパラメーターを構成できることです 。これらの環境変数は、次のカテゴリに大まかに分けることができます。

最初のカテゴリは、Java アプリケーションに関連しています。

  • JAVA_APP_DIR アプリケーション ファイルのルート ディレクトリを設定します。デフォルトは、アプリケーション ファイルが run-java.sh 配置されているディレクトリです。

  • JAVA_APP_NAME アプリケーション プロセスの名前を設定します。

  • JAVA_MAJOR_VERSION JVM のバージョン番号を設定します。java -version デフォルトでは、コマンドの出力から 解析します。

2 番目のカテゴリは、Java アプリケーションのクラスパスに関連しています。

  • JAVA_CLASSPATH 完全なクラスパスを設定します。

  • JAVA_LIB_DIR ライブラリである JAR ファイルのディレクトリを設定します。デフォルトは の JAVA_APP_DIR 値です。

  • JAVA_APP_JAR 実行可能な JAR ファイルへのパスを設定します。

  • JAVA_MAIN_CLASS エントリ クラスの名前を設定します。

3 番目のカテゴリは、Java 操作のパラメーターに関連しています。

  • JAVA_OPTIONS 追加のパラメーターを設定します。

4 番目のカテゴリは、メモリと CPU の実行に関連しています。

  • JAVA_INIT_MEM_RATIO 合計メモリに対する初期ヒープ サイズの比率を設定します。パラメータに -Xms値の 20 表現 20%

  • JAVA_MAX_MEM_RATIO 最大ヒープ サイズを合計メモリのパーセンテージとして設定します。パラメータに -Xmx値の 50 表現 50%

  • JAVA_MAX_CORE CPU コアの最大数を設定します。

5 番目のカテゴリは、デバッグに関連しています。

  • JAVA_DEBUG リモート デバッグを有効にします。

  • JAVA_DEBUG_SUSPEND サスペンド モードでのリモート デバッグを有効にします。

  • JAVA_DEBUG_PORT リモートデバッグ用のポートを設定します。デフォルトは です 5005

6 番目のカテゴリは、HTTP プロキシに関連しています。

  • HTTP_PROXY HTTP プロキシをセットアップします。Java のシステム プロパティ http.proxyHost と http.proxyPort.

  • HTTPS_PROXY HTTPS プロキシをセットアップします。Java のシステム プロパティ https.proxyHost と https.proxyPort.

  • NO_PROXY プロキシを使用しないようにホスト名を設定します。Java システム プロパティに変換されます http.nonProxyHosts

最後のカテゴリは、適用された診断に関連しています。

  • JAVA_DIAGNOSTICS 追加の診断情報の出力を有効にします。

 コンテナのメモリ制約を設定する必要があることに注意してください。これは、  JAVA_INIT_MEM_RATIO Kubernetes コンテナ によって宣言された値です。それ以外の場合、両方の設定は効果がありません。メモリー制約値は、計算の基礎として使用されます。JAVA_MAX_MEM_RATIOresources.limits.memory

特定用途

使い方を詳しく見ていきましょう run-java.sh

実際、Quarkus アプリケーションが JVM モードで実行される場合、デフォルトのコンテナー イメージが使用されます run-java.sh以下は Dockerfile の内容です。

ミラーを構築するときは、  run-java.sh Maven リポジトリからスクリプトをダウンロードし、 /deployments/run-java.sh ファイルとして保存します。 スクリプトENTRYPOINT を直接実行するディレクティブ 。run-java.sh追加の引数は JAVA_OPTIONS 環境変数として渡されます。

FROM registry.access.redhat.com/ubi8/ubi-minimal:8.4 

ARG JAVA_PACKAGE=java-11-openjdk-headless
ARG RUN_JAVA_VERSION=1.3.8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en'
# Install java and the run-java script
# Also set up permissions for user `1001`
RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \
    && microdnf update \
    && microdnf clean all \
    && mkdir /deployments \
    && chown 1001 /deployments \
    && chmod "g+rwX" /deployments \
    && chown 1001:root /deployments \
    && curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /deployments/run-java.sh \
    && chown 1001 /deployments/run-java.sh \
    && chmod 540 /deployments/run-java.sh \
    && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/conf/security/java.security

# Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size.
ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
# We make four distinct layers so if there are application changes the library layers can be re-used
COPY --chown=1001 target/quarkus-app/lib/ /deployments/lib/
COPY --chown=1001 target/quarkus-app/*.jar /deployments/
COPY --chown=1001 target/quarkus-app/app/ /deployments/app/
COPY --chown=1001 target/quarkus-app/quarkus/ /deployments/quarkus/

EXPOSE 8080
USER 1001

ENTRYPOINT [ "/deployments/run-java.sh" ]

JAVA_APP_JAR ここでは、 or は JAVA_MAIN_CLASS 、アプリケーションのエントリポイント JAR ファイルまたは Java クラスを指定するために使用されていないことに注意し てください。この場合、run-java.sh アプリケーションのルート ディレクトリにある唯一の JAR ファイルが の JAVA_APP_JAR 値として検索されます。この時点で、アプリケーションのルート ディレクトリに実行可能な JAR ファイルが 1 つだけ存在する必要があります。そうしないと、スクリプトは失敗します。

run-java.sh スクリプトの使用シナリオを次に示します 。Kubernetes で Java アプリケーションを実行すると、Kubernetes でのみ再現可能なバグが見つかりました。このとき、デバッグのためにJavaのリモートデバッグ機能を有効にする必要があります。この時点で、アプリケーションの Deployment を変更し、 名前JAVA_DEBUGと値の true 環境変数を追加できます。新しい Pod が起動すると、アプリケーションでリモート デバッグが有効になります。kubectl port-forward Pod のポートにアクセスする ことで 5005 、IDE でデバッグできます。私のステーション B のビデオでは、このシーンの特定のデモンストレーションがあります。

ダウンロードが必要な場合は run-java.sh、私の公式アカウントをフォローし、「run-java」とメッセージを送ってください。ネットワーク ディスクのダウンロード アドレスが表示されます。

おすすめ

転載: blog.csdn.net/cheng_fu/article/details/121279978