結論
コンテナ起動時に環境変数を定義する事で反映され、コンテナ起動後に環境変数を変更したい場合は、コンテナを再作成する。
背景
Zabbix Serverをコンテナイメージで作成し、コンテナ内の/etc/zabbix/zabbix_server.confを修正する事で環境変数を追加修正し、コンテナの停止起動で反映されると考えていたが、起動後修正前の状態に戻っている事象に陥った。
Zabbix Serverインストール
コンテナイメージのインストールは、以下の公式サイトを参考にしました。バージョンは6.4.11を選択。
Zabbix Serverの起動コマンド
$ docker run --name zabbix-web-nginx-mysql -t \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
-p 80:8080 \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-mysql:alpine-6.4.11
各コンテナ起動後の状態
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6228f6a18ca8 zabbix/zabbix-server-mysql:alpine-6.4.11 "/sbin/tini -- /usr/…" 4 hours ago Up 4 hours 0.0.0.0:10051->10051/tcp, :::10051->10051/tcp zabbix-server-mysql
752d678d332a zabbix/zabbix-web-nginx-mysql:alpine-6.4.11 "docker-entrypoint.sh" 8 hours ago Up 8 hours 8443/tcp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp zabbix-web-nginx-mysql
f8976ac80e92 zabbix/zabbix-java-gateway:alpine-6.4.11 "docker-entrypoint.s…" 8 hours ago Up 8 hours 10052/tcp zabbix-java-gateway
94abd0eba76b mysql:8.0 "docker-entrypoint.s…" 8 hours ago Up 8 hours 3306/tcp, 33060/tcp mysql-server
$
StartVMwareCollectors変数の追加
以下のように直接コンテナのファイルを修正しStartVMwareCollectors変数を追加した。
$ docker exec zabbix-server-mysql /bin/bash
$ vi /etc/zabbix/zabbix_server.conf
〜修正前〜
### Option: StartVMwareCollectors
# Number of pre-forked vmware collector instances.
#
# Mandatory: no
# Range: 0-250
# Default:
# StartVMwareCollectors=0
〜修正後〜
### Option: StartVMwareCollectors
# Number of pre-forked vmware collector instances.
#
# Mandatory: no
# Range: 0-250
# Default:
StartVMwareCollectors=5
$ exit
コンテナの起動停止を実行しログを確認
StartVMwareCollectors removedと出力されていたが、VMware monitoring YESやusing configuration file: /etc/zabbix/zabbix_server.confと出力されていたので有効化されたと思ったが、Web UI上での設定がうまく動作しないため定義ファイルを確認してみたところ修正前の状態の戻っていることが判明。
$ docker stop zabbix-server-mysql
$ docker start zabbix-server-mysql
$ docker logs -f zabbix-server-mysql
** Preparing Zabbix server
** Preparing database
** Using MYSQL_USER variable from ENV
** Using MYSQL_PASSWORD variable from ENV
** Using MYSQL_ROOT_PASSWORD variable from ENV
********************
* DB_SERVER_HOST: mysql-server
* DB_SERVER_PORT: 3306
* DB_SERVER_DBNAME: zabbix
********************
** Creating 'zabbix' user in MySQL database
** Database 'zabbix' already exists. Please be careful with database COLLATE!
** Table 'zabbix.dbversion' already exists.
** Preparing Zabbix server configuration file
** Updating '/etc/zabbix/zabbix_server.conf' parameter "ListenIP": ''...removed
〜省略〜
** Updating '/etc/zabbix/zabbix_server.conf' parameter "StartVMwareCollectors": ''...removed
〜省略〜
** Updating '/etc/zabbix/zabbix_server.conf' parameter "User": 'zabbix'...added
Starting Zabbix Server. Zabbix 6.4.11 (revision fb6439a).
Press Ctrl+C to exit.
7:20240218:161241.244 Starting Zabbix Server. Zabbix 6.4.11 (revision fb6439a).
7:20240218:161241.244 ****** Enabled features ******
7:20240218:161241.244 SNMP monitoring: YES
7:20240218:161241.244 IPMI monitoring: YES
7:20240218:161241.244 Web monitoring: YES
7:20240218:161241.244 VMware monitoring: YES
7:20240218:161241.244 SMTP authentication: YES
7:20240218:161241.244 ODBC: YES
7:20240218:161241.244 SSH support: YES
7:20240218:161241.244 IPv6 support: YES
7:20240218:161241.244 TLS support: YES
7:20240218:161241.244 ******************************
7:20240218:161241.244 using configuration file: /etc/zabbix/zabbix_server.conf
7:20240218:161241.264 current database version (mandatory/optional): 06040000/06040026
〜省略〜
197:20240218:161241.422 [3] thread started [preprocessing worker #3]
$ docker exec zabbix-server-mysql grep StartVMwareCollectors= /etc/zabbix/zabbix_server.conf
# StartVMwareCollectors=0
その後の調査
変更ファイルが戻ってしまう件について、zabbix_server.conf unchanged等々のキーワードをもとに検索して見たが中々答えが見つけられずかなり苦戦した。そんな中以下のサイトで、コンテナ起動時に設定可能な環境変数の一覧が並んでいるのを見て、そもそもファイルを直接編集するのではなく、毎度コンテナ作成時に環境変数を設定するのが正しいのではないかと気づき試してみることにした。
Zabbix Serverの削除と再作成
起動中のコンテナを停止、起動を行い、-e ZBX_STARTVMWARECOLLECTORS="5"を追加し新たなコンテナを起動した。起動後zabbx_server.confやコンテナのログ出力を見ると設定したい値が反映されていることを無事確認できていた。
$ docker stop zabbix-server-mysql
zabbix-server-mysql
$ docker rm zabbix-server-mysql
zabbix-server-mysql
$ docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
-e ZBX_STARTVMWARECOLLECTORS="5" \
--network=zabbix-net \
-p 10051:10051 \
--restart unless-stopped \
-d zabbix/zabbix-server-mysql:alpine-${VERSION}
582617b998efce104b2f1d086c2c0a1f0b461dbcd4e7f1c1f20ea26047f3c435
$ docker exec zabbix-server-mysql grep StartVMwareCollectors= /etc/zabbix/zabbix_server.conf
# StartVMwareCollectors=0
StartVMwareCollectors=5
$ docker logs -f zabbix-server-mysql
〜省略〜
** Updating '/etc/zabbix/zabbix_server.conf' parameter "StartVMwareCollectors": '5'...added
〜省略〜
$
終わりに
もしかしたら公式ドキュメントをきちんと読めば記載があったのかもしれない、または後から考えるとコンテナなので設定値を変える場合は再作成するという考えも至極真っ当ではあると思った日々でした。