コンテナイメージで作成したZabbix Serverの設定変更方法について

# 結論
コンテナ起動時に環境変数を定義する事で反映され、コンテナ起動後に環境変数を変更したい場合は、コンテナを再作成する。

# 背景
Zabbix Serverをコンテナイメージで作成し、コンテナ内の/etc/zabbix/zabbix_server.confを修正する事で環境変数を追加修正し、コンテナの停止起動で反映されると考えていたが、起動後修正前の状態に戻っている事象に陥った。

# Zabbix Serverインストール
コンテナイメージのインストールは、以下の公式サイトを参考にしました。バージョンは6.4.11を選択。

https://www.zabbix.com/documentation/6.4/en/manual/installation/containers

# Zabbix Serverの起動コマンド
```bash
$ 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
```

# 各コンテナ起動後の状態
```bash
$ 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変数を追加した。
```bash
$ 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上での設定がうまく動作しないため定義ファイルを確認してみたところ修正前の状態の戻っていることが判明。
```bash
$ 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等々のキーワードをもとに検索して見たが中々答えが見つけられずかなり苦戦した。そんな中以下のサイトで、コンテナ起動時に設定可能な環境変数の一覧が並んでいるのを見て、そもそもファイルを直接編集するのではなく、毎度コンテナ作成時に環境変数を設定するのが正しいのではないかと気づき試してみることにした。

https://catalog.redhat.com/software/containers/zabbix/zabbix-appliance-50/5f0dcf09ecb5245089451299?architecture=amd64&image=62f524114e08e6cdcc63cb83

# Zabbix Serverの削除と再作成
起動中のコンテナを停止、起動を行い、-e ZBX_STARTVMWARECOLLECTORS="5"を追加し新たなコンテナを起動した。起動後zabbx_server.confやコンテナのログ出力を見ると設定したい値が反映されていることを無事確認できていた。
```bash
$ 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
〜省略〜
$
```

# 終わりに
もしかしたら公式ドキュメントをきちんと読めば記載があったのかもしれない、または後から考えるとコンテナなので設定値を変える場合は再作成するという考えも至極真っ当ではあると思った日々でした。