概要
railsアプリでデータベースにMysqlを使っていて、docker-composeによるオーケストレーションで使用しています。
しかし、ある日docker-compose upでimageを立ち上げたところ、表題のエラーが・・・。
なんとか修正したので備忘録として残しておこうかと思います。
現象
docker-compose upを実行すると、下記の様なエラーが表示される。
ちなみに先日までは普通に起動して動作していました。
MacBookPro:hogehoge username$ docker-compose up
Starting db_1 ... done
Starting web_1 ... done
Attaching db_1, web_1
db_1 | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
db_1 | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db_1 | 2019-11-08 05:59:07+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.6.46-1debian9 started.
db_1 | 2019-11-08 05:59:09 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1 | 2019-11-08 05:59:09 0 [Note] mysqld (mysqld 5.6.46) starting as process 1 ...
db_1 | 2019-11-08 05:59:09 1 [Note] Plugin 'FEDERATED' is disabled.
db_1 | mysqld: Table 'mysql.plugin' doesn't exist
db_1 | 2019-11-08 05:59:09 1 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
db_1 | 2019-11-08 05:59:09 1 [Note] InnoDB: Using atomics to ref count buffer pool pages
(省略)
環境
rails (5.2.3)
docker (19.03.4)
docker-compose (1.24.1)
mysql (5.6)
Dockerfileでrubyの構築、docker-composeでmysqlとrailsの操作をしています。
# ruby2.5.1のalpineを指定
FROM ruby:2.5.1-alpine
# apk --update --no-cache add でインストールするパッケージを指定します
RUN apk --update --no-cache add tzdata libxml2-dev curl-dev make gcc libc-dev g++ mariadb-dev linux-headers nodejs && \
mkdir /workdir
WORKDIR /workdir
ADD Gemfile /workdir/Gemfile
ADD Gemfile.lock /workdir/Gemfile.lock
ENV BUNDLER_VERSION 2.0.2
# && \で改行していくことにより、より軽量になるそうです
RUN gem install bundler && \
bundle install && \
# Warningがでたのでここでupdateを一度入れています。
apk update && \
# 上で指定したパッケージの中、開発環境を構築したら不要になるファイルたちです。apk delで消しちゃいます。
apk del libxml2-dev curl-dev make gcc libc-dev g++ linux-headers
ADD . /workdir
# 構築したDockerの中に入って、大きく容量をとっているディレクトリを調べました。容量が大きく不要であるcacheファイルは構築後削除しています。
RUN rm -rf /usr/local/bundle/cache/* /workdir/vendor/bundle/cache/*
version: '3'
services:
db:
image: mysql:5.6
environment:
MYSQL_DATABASE: docker_development
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: root
MYSQL_PASSWORD: password
volumes:
- ./mysql/mysql_data:/var/lib/mysql # データの永続化
ports:
- "4306:3306" # ホストからゲストへポートフォワード。sequelProと繋ぎたいので、3306ではなく4306をポートに指定
web:
build:
context: .
dockerfile: Dockerfile
# 一度サーバーが起動すると起動し続けるので、rm -f /workdir/tmp/pids/server.pidで、dockerが起動する度に一旦停止させる
command: /bin/sh -c "rm -f /workdir/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
tty: true
stdin_open: true
depends_on:
- db # DB側のコンテナが出来上がってからwebを実行する
ports:
- "3000:3000" # ホストからゲストへポートフォワード
volumes:
- .:/workdir # ソースコード変更したらDocker側も即反映されるように
結論
まず、ターミナルで下記を実行
rm -rf /var/lib/mysql
その後、アプリケーションのルートディレクトリにある、mysqlというディレクトリを削除しました。
その後、ターミナルで下記を実行
docker-clean all
docker-compose build
docker-compose up
再度、db:create、migrateなどを行えば、問題なく表示されることとなりました。
原因?
dockerでmysqlを起動すると、ルートディレクトリにmysqlというディレクトリが作成されます。
この中にどうやら今までのデータベースの変更内容などが保存されている様です。
で、別のブランチを切って開発を進めていた時にgitignoreしてしまったんですよね。
たぶんそれでmysqlの履歴と整合性が取れなくなってしまったんだと思っています。
あ、gitignoreファイルではmysqlディレクトリを指定するのをやめてます。