Redashコンテナの環境変数を更新する
OSSのダッシュボードサービスであるRedashをAWSで運用しているのだが(公式の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
だけを更新すれば事は足りる。