この記事は Qiita Tech Festa 2026 の MySQL カテゴリへの投稿記事です
Docker × MySQL構築あるある「設定を入れたとコンテナが即クラッシュする問題」
MySQLの設定ファイル(my.cnf)を調整していて、 コンテナを起動した瞬間にエラーで落ちてしまう経験、ありませんか?
特に、 後からインストールするプラグインやコンポーネントの設定を最初から my.cnf に書いておきたいとき。MySQLからは「そのようなオプションは存在しない」とエラーになり、コンテナが停止してしまうという事態が発生します。
「じゃあコンテナ起動後に docker cp で設定ファイルを送り込むか......」
と以前の記事でもそうしていました。
しかし、よくよく調べてみるとMySQLには loose- プレフィックス があることを知りました。
本記事では、この機能を使って、Docker での MySQL コンテナ構築フローを素早くかつスムーズにする方法をご紹介します。
前提環境
本記事では、以下の環境を利用します。
- Docker
- MySQL 8.4
前提ユースケース
前述した記事でも使った「パスワードポリシーを強化する validate_password コンポーネント」を有効化するさいのフローを追っていきます。
なぜ MySQL コンテナは落ちてしまうのか?
たとえば、validate_password コンポーネントの設定(パスワードの最低文字数など)を my.cnf に書きたい場合、通常は以下のように記述します。
[mysqld]
validate_password.policy=MEDIUM
validate_password.length=8
しかし、この設定ファイルを Dockerコンテナの初回起動時(docker run -v my.cnf:/etc/mysql/conf.d/my.cnf ...)にマウントしてしまうと、コンテナはエラーで起動に失敗します。
理由は、起動時点ではまだ validate_password コンポーネントがインストールされていないため、 「validate_password.policy という変数は認識できない」 とMySQLがエラーを出して停止してしまうからです。
これを回避するために、前回の記事では以下のステップを実施しました。
- マウントなしでコンテナを起動
- MySQLに接続し
INSTALL COMPONENTを実行 -
docker cpで外部からmy.cnfを配置する - コンテナを再起動
繰り返して作業では作業手順で漏れそうだったり、自動化するにしてはコンテナ起動やコンテナの再起動の待ち時間をポーリングする必要があり、多少面倒さがあります。
対策: loose- プレフィックス
ここで登場するのが、今回の主役である loose- プレフィックスです。(コマンドライン引数の場合は --loose )
まず、 my.cnf に loose- を書くと何が起こるのかについては以下公式ドキュメントに記載があります。
To specify an option of the form --loose-opt_name in an option file, write it as loose-opt_name.
(引用者意訳:--looseで指定したオプションをファイルで書くには、 loose- prefix を付けて記載します)
--loose フラグが何を意味するかというと、以下にあります。
If an option is prefixed by --loose, a program does not exit with an error if it does not recognize the option, but instead issues only a warning
(引用者意訳:--looseが付いている場合、そのオプションを認識できなくてもエラー終了せず、警告を出すだけに留めます)引用元: MySQL 8.4 Reference Manual: 6.2.2.4 Program Option Modifiers
つまり、オプション名の先頭に loose- を付けるだけで、 「設定項目を認識できなくても、警告を出すだけでMySQLは起動させる」 ことができます。
loose- プレフィックスを使ったフロー
さっそく、my.cnf を以下のように書き換えてみましょう。先頭に loose- を付けるだけです。
[mysqld]
loose-validate_password.policy=MEDIUM
loose-validate_password.length=8
loose-validate_password.mixed_case_count=1
loose-validate_password.number_count=1
loose-validate_password.special_char_count=1
この設定ファイルを使うことで、最初から Docker に my.cnf をマウントすることができます。
export MYSQL_ROOT_PASSWORD='<任意の強いパスワード>'
docker run --name mysql-loose-test \
-v $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf \
-e MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} \
-d mysql:8.4
起動したコンテナに接続し、SQLを実行してコンポーネントをインストールします。
docker exec -it mysql-loose-test mysql -u root -p
mysql> INSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.01 sec)
mysql> exit
最後にコンポーネントが入った状態で再起動すると、設定が反映された状態になります。
docker restart mysql-loose-test
おわりに
設定ファイルの先頭に loose- を足すだけで、未知のオプションによるエラー停止を防ぎ、構築フローを少し軽くすることができました。
この機能は、今回のようなコンポーネント導入時だけでなく、 複数バージョンのMySQLが混在するチーム開発で、新しいバージョン用の設定を古いバージョンでもエラーを出さずに共有したい。といったケースでも役に立つと思います。