mysqldもしMySQLを止めるオプションがあったらセットアップをスキップします。何らかのオプションがある時にはセットアップしない処理のようですね。arg;さて、まずargってどっからでできたんだよ。argって引数ってことだよね?でもどこにも定義されていないぞ?argには何がはいるんだ〜!!????散々調べた結果、驚きの答え...。配列と書きますが、inを省略すると$@がforの対象になるそうです。書いたほうが読みやすくない?みんなこうやって書くの?ともかくargには引数が全部入るわけですね。ヘルプなどのオプションがあったら...もし以下のようなヘルプやバージョン確認などのオプションが与えられていたらwanthelpに1が代入されるようになっています。breakで抜けてますね。wanthelpはのちの条件式で使われます。-'?'|--help|--print-defaults|-V|--versionDockerfileではCMDがmysqldになっているので、本来はなにも引数を与えなくてもMySQLが起動するようになっています。-オプションという風にmysqldを付けて起動する必要があるのですが、このスクリプトのおかげでオプションだけでもMySQLが起動するようになっているのです。thenここは簡単ですね。「引数の1番目が(文字列の)’mysqld’でかつ(-a)$wantHelpが空白の場合(-z)」を表しています。先ほど処理していた特定のオプションがあった場合はここで弾かれるようになっているのですね。これ以降がメインの処理になっていきます。}')"さて何やら複雑な感じです...。データディレクトリの取得DATADIRに何らかの値を代入しようとしているようですね。このラインは$()でくくられているのでコマンド結果展開ですね。--helpの2つのオプションを付けて実行しパイプで次に送っています。--helpが実行されてパイプに渡される訳ですね。$@にはちゃんとオプションも入りますから安心です。以下の様にMySQLのさまざまな設定値などが出力されます。TRUE次にawkでdatadirでマッチする行の2コラム目を取得しています。}'先ほど出力されたなかには以下のような項目があります。これはコンテナに入ってみて確認してみました。/var/lib/mysql/つまりawkで/var/lib/mysql/を取得しているのです。このディレクトリはデータベースのデータが格納される場所のはずです。して得られたDATADIRは以降でも様々に使われます。thenここも簡単ですね。-d)という分岐です。「/var/lib/mysql/mysqlがディレクトリじゃない時〜」ってことになるのだと思います。公式のMySQLではコンテナが起動されると普通はデータベースを自動的に作られます(はず)。データベースが作られると/var/lib/mysql/の直下にmysqlディレクトリが作られるようになっているはずです。このディレクトリを確認することですでにデータベースが作ってあるコンテナなのかどうかの分岐をさせられるようになっているようです。2回め以降はデータベースを作る必要がないですからね。いう分岐がないといつも「データベースつくってええええ」という気味の悪いコンテナになっちゃいマス。fiここでは設定値が不足していた場合の分岐を行っています。どれかを設定しなければいけません。パスワードがない状態ではこの後に行うデータベースの生成が行えないですからね。情報が不足していたら...条件に$MYSQL_ROOT_PASSWORD、$MYSQL_ALLOW_EMPTY_PASSWORD、$MYSQL_RANDOM_ROOT_PASSWORDのすべて(-a)が空白だった場合(-z)に、エラーメッセージを出すようになっていますね。1でエラー終了させています。runの時に実際に試すとどういう挙動になるかわかりますよ。"$DATADIR"ここも難しくないですね。先ほどのDATADIRを使ってディレクトリをつくって、所有権をmysqlに与えています。initialized'--initialize-insecureを実行すると、rootであればパスワード無しでログインできるとのことです。&pid="$!"--skip-networkingでネットワーク越しアクセスを禁止しているようです。コンテナですから外からアクセスされても困りますしね。--skip-networkingに&が付いていますが、これはバックグラウンド実行をさせるためです。pid="$!"でプロセスIDを取得していますが、$!はバックグラウンドで実行された直前のプロセスのプロセスIDを保持しています。バックグラウンド実行した際のmysqldのプロセスIDが入っているはずです。それをpidに代入しているのです。pidは後の処理で使われマス。クライアントの起動の準備さて次のこの部分。