tmuxのセグメント編PECLをインストールする知っておきたいRSA暗号の仕組みDockerfileを読んで理解したいシェルスクリプトに慣れ親しんでる人なら苦労しないのだと思うのですが、@MINOのように経験が浅いとDockerfileはチンプンカンプンです。シェルスクリプトを読み解く力を付けるために、Dockerfileを読む努力をしています。今回読んでみたのは以下です。docker-library/mysql/5.7/Dockerfile本体とdocker-entrypoint.shというシェルスクリプトで構成されています。Dockerfile本体では言うまでもなく主に環境構築が記述されていますが、docker-entrypoint.shでは主にデータベースのセットアップ処理が記述されています。そのため公式MySQLを理解するにはDockerfike本体を読むだけでは不足で、docker-entrypoint.shも読んで理解する必要があります。正直なところdocker-entrypoint.shの方が読むのが難しかったです...。docker-entrypoint.sh編は記事が長くなりすぎたので別記事にしました。docker-entrypoint.shを読みたいということでしたら、以下の記事を参考にしていただけると幸いです。Docker公式MySQLのDockerfileを頑張って読んで理解しようとしてみた[docker-entrypoint.sh編]それではDockerfile本体編のスタートです。debian:jessieMySQLのベースイメージはいまのところdebian8(jessie)です。/docker-entrypoint-initdb.dさてここではユーザとディレクトリを1つ作っています。addedユーザとグループを最初につくるのは、どのような依存性にもかかわらず、いつも一貫したIDを得たい為です。あるので、最初にユーザとグループをつくっているんですね。MySQLをインストールするときに自動で作られるユーザとグループの場合IDをコントロールすることは難しいのですが、こうしておけばいつも同じIDのユーザとグループ作れるんですね。スクリプト実行ディレクトリとは次にディレクトリを1つ作っています。これはデータベースの初期化に使うシェルスクリプトやSQLを入れるようのディレクトリです。このディレクトリにそれらを入れておくとデータベースが作られる際に自動的に実行される仕組みになっています。/var/lib/apt/lists/*ここではperlとpwgenをインストールしています。コメントにはperlのモジュールがない場合のエラーが書かれていますね。後に使うdebconfもたしかperlで書かれていますので、いずれにしてもperlが必要になるようです。pwgenはパスワード生成プログラムです。これはDockerfile上ではなく、docker-entrypoint.shの方でデータベース用のパスワード生成の際に活用されます。--no-install-recommends)のとインストール後にパッケージリストを削除してお掃除してなるべくコンテナの状態が小さくなるようにしています。A4A9406876FCBD3C456770C88C718D3B5072E1F5ここではGPGキーを使ってのパッケージの正当性のチェックを行っています。/var/lib/mysqlバージョン定義ENVコマンドでメジャ−バージョンとパッケージバージョンを定義しています。次にMySQLがあるリポジトリをリストに加えています。結構な長文コメントですな。docker-entrypoint.sh内での処理に関係しているのでは無いかと思います。startなどで再起動させた場合)」で処理を条件分岐をさせている場所があります。データベースが作られると/vat/lib/mysql/mysqlというディレクトリができる(データディレクトリがデフォルトなら)という状況を利用して、その条件分岐では/vat/lib/mysql/mysqlが無いということでデータベースが無いという判断をしています。MySQLをインストールした直後にはおそらくmysql_install_dbのおかげで、権限データベースができてしまっている為(つまり/vat/lib/mysql/mysqlがある状態)にこれを削除する以外に、初回起動か2回目の起動を判断することができない、という意味なのではないと思います。以下のようにして全て削除してまっさらな状態にしているのだと思います。\少し話が前後しましたが、ここではdebconfの設定を行っています。debconfとはパッケージのインストールの際の対話に自動的に答えるためのプログラムです。聞かれる事柄はわかっているので、事前に設定してしまおうという便利な機能です。下記はデータディレクトリの指定の設定です。なにも設定していない('')なのでデフォルトの/vat/lib/mysql/になりま。\次にrootパスワードですが、これもここでは決めていません。docker-entrypoint.shの方で(コンテナとしての)rootならパス無しでログインできる様にしています。\テストデータベースを消すかどうかには消さないを選択しています。\これらは;でつながっていますので、一連の文章としてパイプでdebconf-set-selectionsに渡されます。これでMySQLをインストールする際は自動的にこれらが設定されますのでインストールが中断されることはありません。MySQLインストールあとはインデックスをアップデートしてMySQLパッケージをインストール、リストを削除してお片づけしています。/etc/mysql/my.cnfここではMySQLの設定ファイルであるmy.cnfの書き換えを行っています。sedの処理でbind-addressおよびlogが先頭の行をコメントアウトしています。デフォルトで127.0.0.1になりますが、別途コンテナにIPが与えられるのでこの設定は邪魔になります。/etc/mysql/my.cnfさらにawkで[mysqld]の直下にskip-host-cacheとskip-name-resolveを挿入する処理を行っています。逆引きとホストのキャッシュをスキップする設定です。コメントにも「それを使うなら別なコンテナにやらせてね」とあります。/etc/mysql/my.cnfその結果my.cnfは以下のようになります。/var/lib/mysql公式のMySQLではデータが永続化するようにデータディレクトリをVOLUMEにしています。これでコンテナが一旦止まってもデータが失われることはありません。["docker-entrypoint.sh"]別途紹介しますが、docker-entrypoint.shを/usr/local/bin/にCOPYしてリンクを作っています。ENTRYPOINTとして設定しています。これでコンテナ起動時にはdocker-entrypoint.shが実行されることになります。3306ポートの設定です。3306はMySQLの標準的なポートです。素直に3306なんですね。["mysqld"]最後に引数の設定です。run時に何も引数を指定しない場合は、このmysqldがENTRYPOINTであるdocker-entrypoint.shに渡されることになります。まとめさて足早ではありますが、Docker公式MySQLのDockerfileを読んでみました。正直なところそれほど難しくはなかったかなという印象です。Dockerfileは難しくなくても、docker-entrypoint.shの方が@MINOにとっては難度が高かったです。心を折られる感じの内容が結構あります...。シェルスクリプトに慣れていなくて、それでもDockerfileを読んで理解したいという奇特な方はいっしょに心を折られましょう...。docker-entrypoint.sh編は以下です。mino長年働いていた会社をリストラされてしまったおっさん。なにを思ったか未経験のプログラミングで再起を図ろうとする。プログラミングを勉強していく上で苦しんだこと、ハマったことを中心に記事を書きます。