イメージ再ビルドなしでinit Containerを利用する方法
▣ Docker Containerでサービスされるjava Applicaitonの場合、次のインストール手順を実行します。
▶ [exem-java-agent] インストール準備
❶ exem-java-agentインストールパッケージ
- コンテナ環境にjava agentをインストールするためのパッケージを提供しており、名前は以下のような規則で生成されます。
exem-java-agent-inst_x.x.x.x.tgz
- ファイル構成
configmap.yml: java agentが使用する環境変数(exem-java-agent-env)と設定ファイル(exem-java-agent-config)を指定します。- exem-java-agent-envファイル例
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-java-agent-env
namespace: {{namespace 지정}}
data:
startup_opt: "-javaagent:/exem/java/lib/exem-java-agent.jar -Dexem.run.on.container=true"
- exem-java-agent-envファイル例
exem-java-agent-inst_x.x.x.x.tgz: init containersとして登録するDocker Image- exem-java-agent-configファイル例
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-java-agent-config
namespace: {{namespace 지정}}
data:
java.conf: |
RECEIVER_ADDR={{수집서버 주소 지정}}
local.advice: |
### 作成方法
# パッケージ及びクラスの区切り文字はslash(/)であり、クラスとメソッドはdot(.)で区切ります。
# 強制含有、除外、含有の順で高い優先順位を持つ。
# 強制含有はexclamation mark(!)、除外はdash(-)を接頭辞として付けて表記します。
# ワイルドカード文字(*)を含めてstartWith、endWith演算を行うことができます。
# ロードされた全クラスを対象とした設定は、安定性の問題により動的に適用されません。
### 作成例
# com/inzent.*
# -com/inzent/igate.*
# !com/inzent/igate/util.*
!javax/servlet/http/HttpServlet.*
... (이하 생략)
- exem-java-agent-configファイル例
❷ exem-java-agentイメージファイル
- exem-java-agentのイメージ名は以下のような規則で生成されます。
exem-java-agent-inst:x.x.x.x
- イメージ構成
- exem-java-agentパッケージがインストールされた状態でイメージが提供されます。
- /exem : exem-java-agent起動に必要なバイナリ及び設定、ログディレクトリなどが含まれています。
▶ [exem-java-agent] インストール
◈ deploy yamlにexem-java-agentをインストールするための設定値の追加が必要です。
▷ yamlファイル例
既存顧客のyamlファイルにハイライトされた部分を追加します。
spec:
template:
spec:
volumes:
... (생략)
# exem java agent 設置対象ボリューム
- name: exem-volume
emptyDir: {}
# java agent設定ファイルボリューム。java agentは動的適用不可オプション及びadvice設定のためConfigMapをボリュームとしてマウントする必要がある。
- name: config-volume-java-agent
configMap:
# マウントするConfigMapの名前を入力する。
name: exem-java-agent-config
initContainers:
- name: install-exem-java-agent
image: exem-java-agent-inst:x.x.x
imagePullPolicy: IfNotPresent
volumeMounts:
- name: exem-volume
mountPath: /exem
- name: config-volume-java-agent
mountPath: "/exem-config"
readOnly: true
containers:
- name: # application name
... (생략)
volumeMounts:
- name: exem-volume
mountPath: /exem
env:
- name: EXEM_GROUP_ID
value: "{{group id 지정}}"
- name: EXEM_RUN_ON_CONTAINER
value: "true"
- name: EXEMWID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: EXEM_JAVA_AGENT_NAME
value: "{{agent name 지정}}"
# 以下は[exem-java-agent-env]を使用するtomcatにのみ該当
- name: AGENT_OPTS
valueFrom:
configMapKeyRef:
name: exem-java-agent-env
key: startup_opt
- name: CATALINA_OPTS
value: "$AGENT_OPTS -Dexem.agent.name=${EXEM_JAVA_AGENT_NAME}"
... (생략)
◈ 各設定に関する詳細な説明は以下を参照します。
❶ [exem-java-agent]をインストールするPod共有ボリューム追加
- Init ContainerとJava Applicationコンテナが共通で使用するPod内の共有ストレージを作成します。
❷ ConfigMapボリュームマウントによる外部設定分離

- ConfigMapをボリュームとして別途マウントし、Applicaiton設定を外部から注入できるようにします。
- イメージを修正せずに設定を変更できます。
❸ [exem-java-agent]を適用するためのinit Container設定追加
- exem-java-agentイメージをInit Containerとして実行します。

- exem-java-agentのインストール及び設定注入のためのボリュームマウント構成
- Init ContainerとApplicationコンテナが共に使用する共有ボリュームとConfigMapベースの設定ボリュームをそれぞれマウントします。
- ConfigMapをボリュームとしてマウントすると(config-volume-java-agent)、ConfigMapの各keyはファイル名として、valueは該当ファイルの内容としてマッピングされ、指定されたパス(mountPath)にファイル形態で生成されます。
- Init Containerの過程で基本インストールパッケージにConfigMapに設定された内容を上書きします。
- ConfigMapをボリュームとしてマウントすると(config-volume-java-agent)、ConfigMapの各keyはファイル名として、valueは該当ファイルの内容としてマッピングされ、指定されたパス(mountPath)にファイル形態で生成されます。
❹ Init Containerと既存Application Container間のボリューム共有
- Init Containerで準備したデータをMain Containerで使用するために同一のexem-volumeボリュームをマウントします。
❺ [exem-java-agent]適用に必要なenv(環境変数)追加

| 環境変数名 | 説明 | 備考 |
|---|---|---|
| EXEM_GROUP_ID | WAS Group ID | 設定しない場合は"default"に設定される |
| EXEM_RUN_ON_CONTAINER | コンテナ環境で動作するかどうかの設定 このオプションをtrueに設定してこそ、以下のコンテナ連携のためのenv(EXEMWID)設定が適用され、コンテナと接続可能 | コンテナ環境で動作時はtrue設定 On-premise環境で動作時はfalse設定(デフォルト値) |
| EXEMWID | コンテナ連携のためのkey | EXEM_RUN_ON_CONTAINER=trueに設定してこそEXEMWID設定が適用され、コンテナと接続可能 |
| EXEM_JAVA_AGENT_NAME | WAS name | v3.0.24.16から環境変数/configファイル入力サポート |
| EXEM_RECEIVER_ADDR | 収集サーバー(receiver)アドレス。ip:port形式で入力します。 | v3.0.24.16から環境変数入力サポート |
- EXEM_GROUP_ID
- jvmオプション、configファイルでも設定が可能です。
- 優先順位 : jvmオプション(-Dexem.groupid=) > 環境変数(EXEM_GROUP_ID) > configファイル(EXEM_GROUP_ID)
- デフォルト値 : "default"
- EXEM_RUN_ON_CONTAINER
- jvmオプション、configファイルでも設定が可能です。
- 優先順位 : jvmオプション(-Dexem.run.on.container=) > 環境変数(EXEM_RUN_ON_CONTAINER) > configファイル(EXEM_RUN_ON_CONTAINER)
- デフォルト値 : false
- EXEM_JAVA_AGENT_NAME
- jvmオプション、configファイルでも設定が可能です。
- 優先順位 : jvmオプション(-Dexem.agent.name=) > 環境変数(EXEM_JAVA_AGENT_NAME) > configファイル(EXEM_AGENT_NAME)
- デフォルト値 : "exem-java-agent"
- EXEM_RECEIVER_ADDR
- jvmオプション、configファイルでも設定が可能です。
- 優先順位 : jvmオプション(-Dexem.receiver.addr=) > 環境変数(EXEM_RECEIVER_ADDR) > configファイル(RECEIVER_ADDR)
- デフォルト値 X
❻ (Optional) Tomcat使用時

- 提供されたexem-java-agent-envファイルを利用してCATALINA_OPTSにjava agentオプションを適用します。
★ agent nameは環境変数単独適用をサポートしないバージョン使用時、直接設定またはyaml設定を通じてjvmオプションに適用する必要があります。
-Dexem.agent.name={{agent name 지정}}
★ 収集サーバー(receiver)アドレスは環境変数単独適用をサポートしないバージョン使用時、直接設定またはyaml設定を通じてjvmオプションまたはconfigファイル(ConfigMap)に適用する必要があります。
- 優先順位 : jvmオプション(-Dexem.receiver.addr=) > configファイル(RECEIVER_ADDR)
▶ [exem-java-agent] インストール過程

▶ init-container実行作業
❶ exem-java-agentパッケージ
- イメージ内の/instd-agentパスにexem-java-agent起動に必要なバイナリ及び設定ファイルなどが含まれています。
❷ 共有ボリューム(exem-volume)へのパッケージコピー
- インストールされたパッケージを実行コンテナと共有されるEmptyDirボリューム(/exem)にコピーします。
❸ ConfigMap設定置換
- ConfigMapボリューム(/exem-config)に定義されたユーザー設定を基に、共有ボリューム(/exem)内の既存ファイルの内容を更新します。
- java.confの場合、ファイル全体を上書きせず、ConfigMap設定に明示されたオプションについてのみsedコマンドを使用して置換します。