概要
以前作成したアプリでDocker開発環境の構築をしました。
今回の内容は前回記事の発展系なので、下記もご覧ください。
前回記事
それまではテストコードが問題なく通ってはいたんですが、新しいテーブルを追加したところテスト用データベースでエラーが・・・。
どうやら開発環境用データベースはDocker内部に、テスト用データベースをDockerの外側に構築していたので、開発環境で追加したテーブルをデータベースに反映できなかった模様。
意外と詰まったので、備忘録的にまとめようかなと思っています。
バージョン
・Ruby(2.5.1)
・Ruby on Rails(5.2.3)
・MySQL(5.6)
・Docker(19.03.4)
・docker-compose(1.24.1)
結論
実はごくごく簡単でした。
docker-compose.ymlでtest-dbというコンテナを追加するだけです。
ただその時に、データベース名、パスワード、ユーザー名など必要になってきます。
docker-compose.ymlで設定したデータベース名などを、database.ymlに反映するだけ、という感じですね
ちなみに、テスト用データベースもSequelProで確認したかったので、開発環境データベースのポートとは違うポートを解放してます。
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をポートに指定
# Docker内部でテスト用のデータベースが必要になるので記述
test-db:
image: mysql:5.6
environment:
MYSQL_DATABASE: docker_test
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: test_root
MYSQL_PASSWORD: password
ports:
- "4307:3306" # ホストからゲストへポートフォワード。sequelProと繋ぎたいので、3306ではなく4307をポートに指定
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側も即反映されるように
(省略)
test:
<<: *default
database: my_new_gear_test
username: test_root
password: password
database: docker_test
host: test-db
(省略)
これでdocker内部に入ってRspecのテストを実行しても、問題なく通るはずです!