@daigo01090118 (daigo ikeda)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

dockerのデータベースについて

dockerを用いてrspecの勉強を行なっているものです。

docker-compose upまでは現状できています。
その前にrails db:create , db:migrateを実行しています。
docker-compose up -dを実行した状態で、rspecを走らせた時にエラーになりました。

Failure/Error: ActiveRecord::Migration.maintain_test_schema!

Mysql2::Error:
  Unknown MySQL server host 'db' (0)

調べた限りでは、databese.ymlとdocker-compose.ymlのhost名とサーバー名が違ったりしたらこんなエラーがでたりするみたいですが、見た感じどこが間違っているかわかりませんでした。

database.yml
database: db/production.sqlite3

default: &default
  adapter: mysql2
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  username: root
  password: password
  host: db

development:
  <<: *default
  database: development_database

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: test_database

production:
  <<: *default
  database: production_database

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    volumes:
      - mysql_data:/var/lib/mysql
  web:
    build: .
    ports:
      - "3000:3000"
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
      - bundle:/usr/local/bundle
    depends_on:
      - db
volumes:
  bundle:
  mysql_data:

解決策を見つけることができませんでした。
申し訳ないですが、回答していただけると幸いです。
よろしくお願いします。

追記

実行したコマンド

git clone https://github.com/everydayrails/everydayrails-rspec-2017.git
↓
cd everydayrails-rspec-2017
↓
docker-compose build 
↓
docker-compose run web bundle install
↓
docker-compose up -d
↓
docker-compose exec web rails db:create
↓
docker-compose exec web rails db:migrate
↓
docker-compose run web bundle exec rspec

あとはここにある回答の中で実行したものばかりです。

0 likes

3Answer

Railsは詳しくないのですが、次の点は問題ないでしょうか?

  • dbコンテナが起動している(エラーなどで停止していない)
  • コマンドラインなど他の方法でmysqlに接続できる
0Like

Comments

  1. @daigo01090118

    Questioner

    非常に無知で申し訳ないのですが、dbコンテナが起動しているのはdocker-compose psで確認できるものではないでしょうか??
  2. @daigo01090118

    Questioner

    ➜ everydayrails-rspec-2017 git:(master) ✗ docker-compose ps
    NAME COMMAND SERVICE STATUS PORTS
    everydayrails-rspec-2017_db_1 "docker-entrypoint.s…" db running 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
    everydayrails-rspec-2017_web_1 "bundle exec rails s…" web running
  3. @daigo01090118

    Questioner

    @blue32aさん
    この結果は関係ないのでしょうか?
  4. runningになっているので、dbコンテナは起動しているようですね。

    他のコメントを見ていて思ったのですが、
    もしかしてDocker無くてもRailsを使える環境で、webコンテナの外でコマンド実行していないでしょうか?
  5. @daigo01090118

    Questioner

    確かにそうですね、dockerなしでもrailsはインストールしているので使うことはできます。
    コンテナを起動というのはbuildやupすることでしょうか?
    createやmigrateもdocker-compose up -dで実行していました。
  6. > コンテナを起動というのはbuildやupすることでしょうか?

    そうです。
    db:createやdb:migrateをする前にdocker-compose psで起動しているか確認してください。
    コンテナがrunningになっている状態でdocker compose execでrailsコマンドを実行しているなら、hostがdbなのは問題なさそうに思えます。

    下記のエラーはhostの問題は解決して、先に進んでそうな気がします。

    > An error occurred while loading ./spec/controllers/tasks_controller_spec.rb.
    > Failure/Error: include_context "project setup"
    > ArgumentError:
    > Could not find shared context "project setup"
  7. @daigo01090118

    Questioner

    なるほど。
    もう少し調べてみます。
$ docker-compose run --rm -uroot web bash # もしくはash
# ping db # ここはもうwebサービスコンテナ内

としてwebコンテナからdbにpingが出来るかどうかですかね

0Like

Comments

  1. @daigo01090118

    Questioner

    ping db実行したら

    root@d6c3b10a4f64:/myapp# ping db
    PING db (172.26.0.2) 56(84) bytes of data.
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=1 ttl=64 time=0.291 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=2 ttl=64 time=0.203 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=3 ttl=64 time=0.239 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=4 ttl=64 time=0.190 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=5 ttl=64 time=0.208 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=6 ttl=64 time=0.154 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=7 ttl=64 time=0.195 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=8 ttl=64 time=0.172 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=9 ttl=64 time=0.178 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=10 ttl=64 time=0.320 ms
    64 bytes from everydayrails-rspec-2017_db_1.everydayrails-rspec-2017_default (172.26.0.2): icmp_seq=11 ttl=64 time=0.164 ms

    こんな感じでずらっと出てきました。
    Ctrl + Cで止めました
    --- db ping statistics ---
    169 packets transmitted, 169 received, 0% packet loss, time 170579ms
    rtt min/avg/max/mdev = 0.090/0.173/0.635/0.078 ms
$ docker-compose run --rm -uroot web bash
# ping db -c4 # 疎通確認
# rails db:create
# rails db:migrate

多分これでいけますよ。
可能性としてはwebサービス立ち上げた後に、docker-compose.ymlを色々いじったので、今動いているサービスコンテナの実行内容とdocker-compose.ymlとの内容が一致してないから、一見つながるはずのdbサービスにつながらないという可能性はあります。

docker-compose.yml
version: '3'
  services:
    localhost: # <= db
      image: mysql:5.7

とやるのはまず間違い。サービス自体がhostsにlocalhostを持つので同じネットワーク内にlocalhostという名前のサービスがあっても多分到達できない。

ここはdbのままでいいです。

0Like

Comments

  1. @daigo01090118

    Questioner

    docker-compose run --rm -uroot web bash ←このコマンドを打った状態で
    rspecを実行したら
    An error occurred while loading ./spec/controllers/tasks_controller_spec.rb.
    Failure/Error: include_context "project setup"

    ArgumentError:
    Could not find shared context "project setup"

    hashから抜けた状態でrspec実行した時は
    下のエラーに戻りました。。

    Mysql2::Error:
    Unknown MySQL server host 'db' (0)

Your answer might help someone💌