はじめに
docker-composeの概要を学ぶべく学習上、Ruby+MySQLで環境構築を進めていく中で
ハマってしまった箇所があるのでその備忘録として記事に残します。
環境
- Docker 23.0.5
- ruby 2.7.8
- MySQL 8.0
- rails 6.1.7
- Windows 11
手順
以下のコマンドでDBを作成したところ、、、
$ docker-compose run web rails db:create
こんなプロンプトが返ってきました。
Unknown MySQL server host 'db' (-3)
Couldn't create 'app_development' database. Please check your configuration.
rake aborted!
ActiveRecord::ConnectionNotEstablished: Unknown MySQL server host 'db' (-3)
MySQLサーバーに接続できずDBコンテナが動作しない、、、
まずは、ログを確認
$ docker-compose logs db
ログの中の一番始めのエラーで以下のエラー文が吐かれたいました。
[ERROR] [MY-012960] [InnoDB] Cannot create redo log files because data files are corrupt or the database was not shut down cleanly after creating the data files.
Dataファイルが破損しているみたいなエラーが発生していました。
解決方法
実はパスワードの設定を間違ったまま db:create
を実施してエラーが出た際に破損したDataファイルが残ったままでその上で再度実施した際に上記のエラーが発生した模様です。
docker-compose.ymlにデータ永続化のために、ボリュームマウントしていたため、
docker compose downでコンテナを削除した後もデータディレクトリの中身が保持されていました。
version: '3'
services:
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./src/db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: password
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- ./src:/app
ports:
- "3000:3000"
depends_on:
- db
なので、一旦Dataファイルが含まれているDataディレクトリを初期化する必要があります。
ボリュームごとコンテナを削除します。
$ docker-compose down -v
mysql_dataディレクトリ配下のファイルも削除しておきます。
docker system prune -a
で不要なコンテナやイメージを削除し、再度ビルドします。
$ docker system prune -a
:
$ docker-compose build
ビルドが終わったら、DB作成。
$ docker-compose run web rails db:create
今度こそDBの作成に成功しました!
Created database 'app_development'
Created database 'app_test'
コンテナも起動できている様子!
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
rails_docker-db-1 mysql:8.0 "docker-entrypoint.s…" db About a minute ago Up About a minute 3306/tcp, 33060/tcp
参考