悩んだ末に絞り出したコンテナ設定の備忘録です。
条件
下記の設定が記載されたテンプレートを元に必要な機能を追記する
・mysql5.7公式dockerイメージを元に、その他必要な設定をcomposeファイルで行う
・データ用のボリュームを用意しコンテナ起動時にマウント
・Mysqlの環境変数の設定がなければDB名等をダミーで作成するシェルが、コンテナ起動時にDBのボリュームが存在しない場合に実行される
これに加え
・初回コンテナ起動時にテーブル定義〜ダミーデータのインポートまで自動で行えるようにしたい
辿り着いた設定
実際のファイルはここに載せると長くなる為載せないけど、こんなイメージのものを作成
composeファイルでイメージがビルド
↓
下記のディレクトリがマウント
・データ用ディレクトリ
・mysql設定ファイル配置ディレクトリ
・エントリーポイント用ディレクトリ
↓
エントリーポイント用ディレクトリに下記を配置
・init.sh(テンプレート)
・テーブル定義用sqlファイル
・データインポート用シェル(インポートするデータサイズが大きい為シェル内で圧縮されたファイルの解凍等も行っている)
テーブル定義とデータ部分のインポートを分けたので何かエラーがあったときに箇所が明確になる
また、テーブル定義かデータのどちらかを差し替えたい場合も分けて対応できる
あと、データインポート用シェルには必要な処理を色々追記できるというメリットがある
(インポートが終わったらdumpファイルを削除するとか)
若干はまったこと
composeファイルに記載した下記の変数について
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
この設定によりcomposeファイルで
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
DB_NAME: test
DB_USER: root
上記のように設定すると、testDBのrootユーザーにはパスワードが存在しないはずなのに、なぜかパスワードが生成された状態でDBが起動する為不思議に思っていたけど、テンプレートのシェルをよく見たら「パスワードが空または定義されていない場合、これを代入」的な処理になっていたので、これが原因とわかった。
dbName="${DB_NAME:-aaa}"
dbUser="${DB_USER:-bbb}"
dbPassword="${DB_PASSWORD:-ccc}"
sql="create database if not exists ${dbName}"
echo "${sql}" | ${cmd} mysql
sql="grant all on ${dbName}.* to ${dbUser}@'%' identified by '${dbPassword}'"
echo "${sql}" | ${cmd} mysql
細かく検証していないけど、デフォルト(localhostからのアクセスのみ受け付ける)rootユーザーのパスワードが無くなるという設定のための専用変数ということはさすがにないはず。
どこかで配布されているテンプレートなんだろうか、、出どころ不明だけど、今回はこれを元に作業している為仕方ない、これに手を加えない手段だと、手っ取り早いのはcomposeファイルでパスワードを設定してしまう方法なのでそれで対応。
もしシェルを改修して良ければ、こんな感じでやるかも
if [DB_PASSWORDが値関係なく(nullでも)定義が存在すれば]; then
定義されているものを優先(nullでも)
else
xxxxxxxxを使用する