5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Docker】Rspecテスト用データベースの仮想環境構築

Last updated at Posted at 2019-11-14

概要

以前作成したアプリで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で確認したかったので、開発環境データベースのポートとは違うポートを解放してます。

docker-compose.yml
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側も即反映されるように
database.yml
(省略)
test:
  <<: *default
  database: my_new_gear_test
  username: test_root
  password: password
  database: docker_test
  host: test-db
(省略)

これでdocker内部に入ってRspecのテストを実行しても、問題なく通るはずです!

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?