Qiita初投稿です!
すでにたくさん記事が上がっている内容ですので、この記事は自分の日記のように書きたいと思います。
きっかけ
先日、MySQLのバージョン5.6と5.7の差によって以下のようなエラーが起こりました。
# ActiveRecord::StatementInvalid: Mysql2::Error: Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'column_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by:
手元ではMySQL5.7を使っていたのですが、会社ではMySQL5.6.38を使っていたためです。
自分のlocalのMySQLバージョンを5.6に下げる、という対応でもよかったのですが、
会社の先輩に「dockerでバージョン共存させてみたら?」と言われたのでやってみました。
dockerやMySQLはすでに設定済という前提で進めます。
記事の最後にRailsアプリからDB HOSTの向き先を変えるところも紹介しますが、Rails5を使っています。
docker-machineの作成
以下のコマンドで作成・確認します
$ docker-machine create --driver virtualbox dev
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
dev - virtualbox Running tcp://192.168.99.100:2376 v18.02.0-ce
ここでSTATE
がRunning
になっていなかったら再起動します。
MySQLをインストール
バージョンを指定しつつ、dockerにMySQLをインストールします。
$ docker pull mysql:5.7
$ docker pull mysql:5.6.38
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 f0f3956a1dd7 6 days ago 409MB
mysql 5.6.38 15a5ee52ec53 2 months ago 299MB
##コンテナを起動
バージョン5.6の方で、コンテナ・MySQLの起動までやってみます。
$ docker run --name mysql5.6.38 -p 3307:3306 -e MYSQL_DATABASE=xxx -e MYSQL_USER=root -e MYSQL_ROOT_PASSWORD=xxx -d mysql:5.6.38
f1e8e25e6db7c26bc28dd2c3816ba5aj5b9d1504dc74f67e206566ed112g3b4a
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1e8e25e6db7 mysql:5.6.38 "docker-entrypoint.s…" 58 seconds ago Up 58 seconds 0.0.0.0:3307->3306/tcp mysql5.6.38
$ mysql -h$(docker-machine ip dev) -P3307 -uroot -pxxx
#いろいろ書かれる
・
・
・
mysql>
##Railsのデータベースへの向き先を変える
development環境とtest環境のみ向き先を変えたいので、
dotenvというgemを利用します。
gem 'dotenv-rails'
DB_HOST=192.168.99.100
DB_PORT=3307
host: <%= ENV['DB_HOST'] || '127.0.0.1' %>
port: <%= ENV['DB_PORT'] || 3306 %>
.env
ファイルはgit管理されていないので、手元で開発するときはENV['XXX']
を読み、本番環境では'127.0.0.1'
などを読みます。
これで無事にRailsアプリをMySQL5.6.38で管理できるようになりました!
会社で開発するたびにdockerを起動するのが面倒(普段dockerを使わない人)だなぁと思うので、模索中です。
##参考にさせていただいた記事
・DockerでMySQL複数バージョンを共存させる
・Railsで開発環境のデータベースだけdockerにしてみる
・環境によって変わる設定値はdotenvを使うと便利