Redashコンテナの環境変数を更新する

OSSダッシュボードサービスであるRedashAWSで運用しているのだが(公式のEC2イメージを使用)、メールサーバーの設定を変更する必要があったので、その手順をまとめておく。

Redashはユーザー作成時の通知等でメールを使えるのだが、そのメールサーバーの設定はWebコンソールからでは行えず、Dockerコンテナの環境変数に定義してやる必要がある。

Dockerコンテナに読み込ませる環境変数ファイルは/opt/redash/envに設置されており、docker-composeによりevn_fileでコンテナに展開されている。

メールサーバー関連で最低限必要となる環境変数は以下の通り(詳細は公式ドキュメントを参照)。

  • REDASH_MAIL_SERVER
  • REDASH_MAIL_PORT
  • REDASH_MAIL_USE_TLS
  • REDASH_MAIL_USERNAME
  • REDASH_MAIL_PASSWORD
  • REDASH_MAIL_DEFAULT_SENDER

運用している環境ではAWS SES(東京リージョン)を使っていたので、定義している値はこんな感じ。

REDASH_MAIL_SERVER=email-smtp.ap-northeast-1.amazonaws.com
REDASH_MAIL_PORT=587
REDASH_MAIL_USE_TLS=true
REDASH_MAIL_USERNAME=AKIAXXXXXXXXXXXXXXXX
REDASH_MAIL_PASSWORD=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
REDASH_MAIL_DEFAULT_SENDER=no-reply@example.com

ここで定義していたSESのSMTP認証情報を変更した為、REDASH_MAIL_USERNAMEとREDASH_MAIL_PASSWORDを更新してRedashコンテナに反映しなければならなくなった。

docker-compose upで更新

Redashコンテナの環境変数を更新するのは実に簡単で、/opt/redash/envの内容を変更した後、docker-compose up -dでコンテナを再作成してやるだけ。

$ sudo su -
$ cd /opt/redash/
$ vi env ←定義された値を編集
$ docker-compose up -d

docker-compose stop/startでコンテナを再起動するだけでは、稼働中のコンテナがenv_fileに定義された環境変数を再展開しない為、一旦、コンテナ自体を作り直してやる必要がある。

なお、Redashのデータを保管するpostgresコンテナのVolumeは、ホスト側にマウントされて永続化しているので、コンテナを再作成したとしてもデータが失われる事は無い。

docker-compose stop/startで更新

一応、コンテナを作り直す事はせずに、コンテナファイル自体を書き換えてしまい、dockerデーモンも再起動するのであれば、docker-compose stop/startでコンテナの環境変数を更新する事も出来る。

Dockerコンテナは起動すると、コンテナ毎に/var/lib/docker/containers/コンテナフルIDといったディレクトリが作成され、その配下に各種の関連ファイルを保存している。

例えば、コンテナID(省略形)「584d782142d7」が起動した場合であると、

/var/lib/docker/containers/584d782142d75d3d67738007f054cccbc846ac22b2e3ad370013754c0f491fda

といったディレクトリが出来て、配下にはコンテナの実体に関わる様々なファイル群が配置される。

$ cd /var/lib/docker/containers/584d782142d75d3d67738007f054cccbc846ac22b2e3ad370013754c0f491fda/
$ ls -la
-rw-r----- 1 root root 339367  8月 31 21:12 584d782142d75d3d67738007f054cccbc846ac22b2e3ad370013754c0f491fda-json.log
drwx------ 2 root root   4096  8月 31 19:30 checkpoints
-rw------- 1 root root   4162  8月 31 19:30 config.v2.json
-rw-r--r-- 1 root root   1487  8月 31 19:30 hostconfig.json
-rw-r--r-- 1 root root     13  8月 31 19:30 hostname
-rw-r--r-- 1 root root    174  8月 31 19:30 hosts
drwx------ 3 root root   4096  8月 31 19:30 mounts
-rw-r--r-- 1 root root     77  8月 31 19:30 resolv.conf
-rw-r--r-- 1 root root     71  8月 31 19:30 resolv.conf.hash

この内の、config.v2.jsonというファイルがコンテナの状態を記録しており、

$ cat config.v2.json
{"StreamConfig":{},"State":{"Running":true, 〜〜〜 中略 〜〜〜 ,"SeccompProfile":"","NoNewPrivileges":false}

JSON中に以下の様なリスト形式でコンテナに展開されている環境変数を持っている。

"Env":["REDASH_MAIL_SERVER=email-smtp.ap-northeast-1.amazonaws.com","REDASH_MAIL_PORT=587", 以下略]

なので、このファイル自体を書き換えてしまえば、コンテナを作成し直さずに、コンテナの環境変数を更新する事が出来る。

手順としては、起動中のコンテナ、Dockerデーモンという順番で停止してから、config.v2.jsonのEnvの値を書き換えて、Dockerデーモン、コンテナと起動しなおす形になる。

$ sudo su -
$ cd /opt/redash/
$ docker-compose stop
$ systemctl stop docker
$ cd /var/lib/docker/containers/コンテナフルID/
$ cp -vip config.v2.json ~/tmp ←バックアップ
$ vi config.v2.json ←Envの値を書き換える
$ cd -
$ systemctl start docker
$ docker-compose start

config.v2.json環境変数だけを保持している訳では無いので、環境変数以外の設定を変えたいといった場合にも色々と応用は可能である。

しかし、Redashコンテナの環境変数を更新するだけなのであれば、面倒なのでわざわざこの方法をとる必要性はあまり無いかと思う。

Dockerコンテナのレイヤーが増えないので、ストレージ容量的には優しいというメリットが微妙にあるかもしれない。

ちなみに、Redashを構成するコンテナ群は以下の様になっているのだが、

  • nginx
  • server
  • scheduler
  • scheduled_worker
  • adhoc_worker
  • redis
  • postgres

ユーザー作成時にメール送信するのはschedulerなので、メールの利用がそこだけなのであれば、最低限、schedulerのconfig.v2.jsonだけを更新すれば事は足りる。