はじめに
「環境変数を使って接続の設定をすることは開発時には一般的にOKですが、本番環境では非常にお勧めできません」という情報がありましたので、普段使っている環境でsecretsを使う方法を実際に試してみました。
Laravelなどでは、環境変数はフレームワーク側のenvファイルで取り扱うことが多いため、この手法を使うことはあまりないかもしれませんが備忘録として記事にまとめたいと思います。
動作確認環境
- Windows10 Home
- wsl2
- Docker Desktop for Windows
- Ubuntu20.04 LTS
サンプルのdockerfile
version: "3.9"
volumes:
db-store:
services:
db:
build:
context: .
dockerfile: ./infra/docker/mysql/Dockerfile
ports:
- target: 3306
published: 3306
protocol: tcp
mode: host
volumes:
- type: volume
source: db-store
target: /var/lib/mysql
volume:
nocopy: true
secrets:
- db_root_password
- db_user_password
environment:
- MYSQL_ROOT_USER=root
- MYSQL_USER=db_user
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
- MYSQL_PASSWORD_FILE=/run/secrets/db_user_password
secrets:
db_root_password:
file: ./root_password.txt
db_user_password:
file: ./user_password.txt
root_password.txtの中身の例 ↓
rootnopassword
secretの仕組み
secret指定すると、指定したファイルの内容を/run/secrets/以下にマウントしてくれます。
MySqlのイメージではMYSQL_ROOT_PASSWORD_FILEといったような形で「_FILE」と付けてあげるとファイルから環境変数を読み取ることができるようになります。
これら2つを組み合わせ、環境変数を秘密情報として扱うことができるようになります。
トラブルシューティング
「MYSQL_ROOT_PASSWORD_FILE」の指定は、「mysql:8.0」イメージで使えます。
イメージによっては使えないので注意しましょう。
トラブルシューティング2
マウントされるパスワードは、スペース、キャリッジリターン、および最後の改行も保存されます。
パスワードを保存してあるファイルは最低限の内容のみにしましょう。
トラブルシューティング3
シークレット情報を保存するファイルの権限は0444にする必要があるようです。
もし上手く読み込みがされない場合は、マウントもとファイルのファイル権限を読み取り専用に変更して下さい。
chmod 0444 {ファイル名}
注意点
DockerfileのENVやARGを使い環境変数を設定すると、Docker imageに変数の中身が残ってしまうため注意しましょう。
参考ページ