LoginSignup
0
0

More than 3 years have passed since last update.

コンテナでDBを作る【mysql】

Posted at

悩んだ末に絞り出したコンテナ設定の備忘録です。

条件

下記の設定が記載されたテンプレートを元に必要な機能を追記する
・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を使用する
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0