MySQLの入ったdbコンテナが立ち上がらない!〜Dockerイメージ、docker-compose.ymlを別の開発環境で中身を変えずに使いまわそうとして〜


備忘録です。

1.やりたいこと

docker-compose upコマンドでMySQLの入ったdbコンテナを立ち上げたい。

2.課題

dbコンテナでエラーが発生し、立ち上がらない。

状況

  • 学習サービスで配布のDockerイメージ、docker-compose.ymlを、別の開発環境でも使いまわそうとした
  • Dockerコンテナは、ApacheとPHPの入ったappコンテナと、MySQLの入ったdbコンテナ
  • docker-compose.yml は何も中身をいじらずdocker-compose up -dコマンドを実行したら、立ち上がらなかった(そのままで使いまわせると思ったのに…)
portfolio $ docker-compose ps
     Name                    Command               State            Ports
---------------------------------------------------------------------------------
portfolio_app_1   docker-php-entrypoint apac ...   Up       0.0.0.0:50080->80/tcp
portfolio_db_1    docker-entrypoint.sh mysqld      Exit 1
  • appコンテナは立ち上がってる

    環境

  • MacOS 10.14.6

  • Docker Desktop for mac

  • dbコンテナ(MySQL:5.5.62)

  • appコンテナ(php:7.4-apache)

参考:docker-compose.ymlの中身

docker-compose.yml


version: "3"

services:
  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    ports:
      - "50080:80"
    volumes:
      - ./src:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.5.62
    ports:
      - "53306:3306"
    volumes:
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/mysql_data:/var/lib/mysql
    env_file:
      - ./docker/db/db-variables.env

ログを確認すると下記が出力されている。

エラーログ
201123 21:20:26 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
201123 21:20:26 [Note] mysqld (mysqld 5.5.62) starting as process 1 ...
201123 21:20:26 [Warning] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
201123 21:20:26 [Note] Plugin 'FEDERATED' is disabled.
201123 21:20:26 InnoDB: The InnoDB memory heap is disabled
201123 21:20:26 InnoDB: Mutexes and rw_locks use GCC atomic builtins
201123 21:20:26 InnoDB: Compressed tables use zlib 1.2.11
201123 21:20:26 InnoDB: Using Linux native AIO
201123 21:20:26 InnoDB: Initializing buffer pool, size = 128.0M
201123 21:20:26 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file ./ib_logfile1 is of different size 0 0 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
201123 21:20:26 [ERROR] Plugin 'InnoDB' init function returned error.
201123 21:20:26 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
201123 21:20:26 [ERROR] Unknown/unsupported storage engine: InnoDB
201123 21:20:26 [ERROR] Aborting

201123 21:20:26 [Note] mysqld: Shutdown complete

「ログファイル ./ib_logfile1 は .cnf ファイルで指定されたサイズ 0 5242880 バイトとは異なる 0 0 バイト」なのが、問題らしく、InnoDBとやらが立ち上がらず、MySQLもシャットダウンする様子。

最初はローカルのディレクトリの ib_logfile1 のサイズの設定などで真っ向勝負して時間を投下しましたが、初学者には手強すぎて、Dockerの基礎をごりっと学習して、下記の対策にようやくたどり着きました…

3.最終的に効果のあった対策

ローカルのディレクトリ./docker/db/mysql_dataに同期する構成から、Dockerのボリュームを作成してそこに保存する構成に変更しました。

  • MySQLの古いデータを削除します
# MySQLの以前のデータを削除する
rm -rf docker/db/mysql_data
  • Dockerの不要なイメージ、コンテナ、ネットワーク、ボリュームを削除します
# Docker コンテナの停止・削除
docker-compose down

# Docker の不要なイメージ、コンテナ、ネットワーク、ボリュームを削除する
docker system prune
  • MySQLのデータのローカルのディレクトリ(./docker/db/mysql_data)への同期をやめるために、 docker-compose.yml の下記の行を削除します

db:
  volumes:
    - ./docker/db/mysql_data:/var/lib/mysql # ← この行を削除
  • MySQLのデータを、ボリュームで永続化する(コンテナ削除してもデータは残す)ために、 docker-compose.yml に下記の行を追加します(mysql_dataという名前のボリュームを作成)

db:
    image: mysql:5.5.62
    ports:
      - "53306:3306"
    volumes:
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - mysql_data:/var/lib/mysql # ← この行を追記
    env_file:
      - ./docker/db/db-variables.env

volumes:  # ← この行を追記
  mysql_data:  # ← この行を追記
  • イメージから作成し直します
# Docker イメージのビルド
docker-compose build

# Docker コンテナの起動
docker-compose up -d

# コンテナの起動状態を確認する
docker-compose ps
     Name                    Command               State            Ports
----------------------------------------------------------------------------------
portfolio_app_1   docker-php-entrypoint apac ...   Up      0.0.0.0:50080->80/tcp
portfolio_db_1    docker-entrypoint.sh mysqld      Up      0.0.0.0:53306->3306/tcp

立ち上がった!
MySQLでテーブルを作成して、コンテナを一旦削除してみても、データは残ったままでした!