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_RATIO
resources.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」とメッセージを送ってください。ネットワーク ディスクのダウンロード アドレスが表示されます。