複数のDockerのコンテナを環境変数によって設定する場合の問題点

こんにちは、Pythonエンジニア見習いです。今回は複数のDockerのコンテナを環境変数によって設定する場合の問題点について書きます。現在私は複数のマイクロサービスによって構成されているプロジェクトに携わっています。当初プロジェクトではそれぞれのマイクロサービスの設定を環境変数で一括管理していました。それによりさまざまな問題が発生したので、この設定方法をアンチパターンとしてみなさんに共有します。

環境変数による設定の何が問題なのか

容易に書き換わってしまう

環境変数には書き込み権限を設定することはできません。そのため、スクリプトの途中で書き換わってしまう可能性があり、実際に過去にShellshockhttpoxyなどの重大な脆弱性を生み出しています。

別のプロセスから環境変数をチェックすることが困難

環境変数はプロセスごとに読み込まれます。そのため、ユーザーが同一であったとしても同じ環境変数を共有しているとは限りません。ここで問題となるのが、Dockerのコンテナ上でサーバープロセスが動いている場合です。コンソールが使える状況であれば、echoで確認することは出来ますが、すでにプロセスが走っている場合、そのような手段がとれないため確認が難しくなります。

sshsudoを使用した際に環境変数が引き継がれない

sshsudoを使用した場合、元のユーザーで設定していた環境変数は引き継がれません。そのため、使用するときには環境変数を引き継ぐように明示的に設定しなければいけません。

結論

環境変数による設定は環境またはユーザーごとに設定するべきではない場合や容易に書き換わってほしくない場合には不適切です。ちなみに、現在ではファイル名が環境変数名でその値が環境変数の値になるように各環境変数ごとにファイルを作成し、それをコンテナにマウントしています。例えば、

EXAMPLE=foo

という値があったとすると、exampleというファイルの中に

foo

と書いて、cat等で読み込みます。