質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

1367閲覧

Dockerコンテナ内でrails db:createすると、Unknown MySQL server host 'db' (-2)と出る。

T.Adams

総合スコア40

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/03/30 13:39

編集2020/03/30 14:16

前提

ローカルのMacOSで、Docker Desktop for Macを使用しDockerコンテナを立ち上げ、その上にRailsアプリを作成したいと考えています。構成は、Docker + Rails6 + MySQL5.7.29です。

分からないこと

コンテナ内に入り込みrails newしたのち、rails db:createを実行すると、以下のように警告やエラーが出力されます。以下4行目にUnknown MySQL server host 'db' (-2)という記載が出ており、これがエラーの原因であると考えています。「dbという名前のMySQLサーバホストが分からない」と言われています。下記に掲載しておりますが、

Bash

1Warning: the running version of Bundler (2.1.2) is older than the version that created the lockfile (2.1.4). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.1.4`. 2/usr/local/bundle/gems/actionpack-6.0.2.2/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call 3/usr/local/bundle/gems/actionpack-6.0.2.2/lib/action_dispatch/middleware/static.rb:110: warning: The called method `initialize' is defined here 4Unknown MySQL server host 'db' (-2) 5Couldn't create 'phase2_development' database. Please check your configuration. 6rails aborted! 7Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2) 8/usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect' 9/usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize' 10/usr/local/bundle/gems/activerecord- 11121314(以下一部省略) 15161718bin/rails:3:in `load' 19bin/rails:3:in `<main>' 20Tasks: TOP => db:create 21(See full trace by running task with --trace)

Dockerfile

1FROM ruby:2.7.0 2 3ENV LANG C.UTF-8 4ENV APP_ROOT /usr/src 5 6WORKDIR $APP_ROOT 7 8RUN set -ex && \ 9 apt-get update -qq && \ 10 apt-get install -y sudo && \ 11 : "Install node.js" && \ 12 curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - && \ 13 apt-get update -qq && \ 14 apt-get install -y nodejs && \ 15 : "Install yarn" && \ 16 curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \ 17 echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \ 18 apt-get update -qq && \ 19 apt-get install -y yarn && \ 20 : "Install rails6.X latest version" && \ 21 gem install rails --version="~>6.0.0" 22

以下わかりやすくファイル名の部分にdockerComposeと記載しましたが、本当はrailsアプリdocker-compose.ymlです。

dockerCompose

1version: '3' 2services: 3 db: 4 image: mysql:5.7.29 5 container_name: rails_mysql 6 ports: 7 - "3306:3306" 8 environment: 9 MYSQL_ROOT_PASSWORD: root 10 MYSQL_PASSWORD: password 11 TZ: 'Asia/Tokyo' 12 command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_ja_0900_as_cs 13 14 web: 15 build: . 16 container_name: rails_web 17 volumes: 18 - .:/usr/src 19 ports: 20 - "3000:3000" 21 environment: 22 PORT: 3000 23 BINDING: 0.0.0.0 24 stdin_open: true 25 tty: true 26 links: 27 - db 28 restart: unless-stopped # to wait mysql up :(

以下わかりやすくファイル名の部分databaseと記載しましたが、本当はrailsアプリ/config/database.ymlです。

database

1default: &default 2 adapter: mysql2 3 encoding: utf8mb4 4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 5 username: root 6 password: 7 socket: /tmp/mysql.sock 8 9development: 10 <<: *default 11 database: phase2_development 12 13test: 14 <<: *default 15 database: phase2_test 16 17production: 18 <<: *default 19 database: phase2_production 20 username: phase2 21 password: <%= ENV['PHASE2_DATABASE_PASSWORD'] %> 22

自分で調査した内容

以下調査した内容3件実施しました。いずれも私と同様にエラーが出ているようです。ここで記載された内容を実施してみましたが、結果が変わらないため、ここで質問させていただきました。

環境情報

  • Ruby 2.7
  • Rails: 6.0.2.2
  • ホストOS: MacOS Catalina 10.15.4
  • docker: 19.03.8
  • docker-compose: 1.25.4

参考資料

以下の手順を使用して、実施しています。ただし、MySQLのバージョンは5.7.29を使用しています。
Docker + Rails6 + MySQL8.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

はっきりとした原因が分からないため、本件はクローズとさせてください。
MySQLの権限の設定が誤っていたかもしれません。少しモヤモヤしますが、他の方の情報を参考に実施した場合はうまくいきました。様々協力してくださった方々、ありがとうございました。

投稿2020/04/04 07:30

編集2020/04/04 07:31
T.Adams

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

links: - db:mysql

↑の指定だとDBコンテナのホスト名はmysqlになっているので、docker-compose.ymlを↓のように書き換えてみてください!

links: - db

投稿2020/03/30 13:55

ymneet

総合スコア154

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.Adams

2020/03/30 14:10 編集

ご返答ありがとうございます。 はじめは、「- db」としていましたが、「自分で調査した内容」の記事に記載がありましたとおり、「-db:mysql」としました。しかし状況が変わらないため、 「docker・Rails・MySQLを使った時に出たUnknown MySQL server host 'localhost'」のリンク先にあるように修正を加えてみました。変えても状況は変わりませんでした(・・;)
ymneet

2020/03/30 14:12

ありがとうございます。失礼しました。。 dbのコンテナは立ち上がっているのでしょうか? docker-compose run --rm db sh や docker-compose ps の結果があると原因切り分けができるかもしれません。
T.Adams

2020/03/30 14:23 編集

いえいえ。誤解を生まないように記載すべきでしたし、「-db」の方を本記事に記載すべきでした(汗)。修正しておきます。 docker-compose ps を実施した結果を記載します。このコマンドはコンテナ内部に入って実行した場合は、command not foundと出力されたため、コンテナ内から出て、ローカルのdocker-compose.ymlが配置されたディレクトリ配下で実行しました。 ``` $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------ rails_mysql docker-entrypoint.sh mysql ... Exit 1 rails_web irb Up 0.0.0.0:3000->3000/tcp ``` docker-compose run --rm db shを実施した場合、#のみ記載されました。 ``` $ docker-compose run --rm db sh # ```
T.Adams

2020/03/30 14:26

補足です。参考資料のGitHub上にも記載されていますが、docker ps -aを実行した際は、以下のようになっています。 ``` $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 62f3e7b4eb62 docker_web "irb" 2 hours ago Up 2 hours 0.0.0.0:3000->3000/tcp rails_web 6693e6d235d6 mysql:5.7.29 "docker-entrypoint.s…" 2 hours ago Exited (1) 2 hours ago rails_mysql ```
ymneet

2020/03/30 14:37

ありがとうございます。 docker-compose ps の結果をみる限りmysqlのコンテナが落ちていますね。 一旦↓docker-compose.ymlのdb部分をこれに書き換えてdocker-compose restartをしてもらえますか? commandがmysql8.0っぽかったので、、、 db: image: mysql:5.7.29 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root MYSQL_PASSWORD: password TZ: 'Asia/Tokyo' これでダメなようなら docker-compose restart mysql を行い、docker-compose logs でログを確認すれば原因がわかるかもしれません。
退会済みユーザー

退会済みユーザー

2020/03/30 14:41

あれ「container_name: 」 設定すると ホスト名につかわれるんじゃなかったけ
ymneet

2020/03/30 14:46

それっぽいですね・・・長々と失礼しましたmm
T.Adams

2020/03/30 14:58

ymneet 様 ①docker-composeを上記の記載のとおりに修正後、docker-compose restartを実施。その後コンテナ内に入り、railsアプリ配下でrails db:create実施したが、エラーが変わらない。 ②コンテナ内から出て、docker-compose restart mysqlを実施。コマンドがないと言われたので、mysqldでも実施。No such serviceのまま。 $ docker-compose restart mysql ERROR: No such service: mysql ③docker-compose logsを実施。 ``` rails_mysql | 2020-03-30 21:12:42+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian10 started. rails_mysql | 2020-03-30 21:12:42+09:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config rails_mysql | command was: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_ja_0900_as_cs --verbose --help rails_mysql | 2020-03-30T12:12:42.769883Z 0 [ERROR] Unknown collation: 'utf8mb4_ja_0900_as_cs' rails_mysql | 2020-03-30T12:12:42.774244Z 0 [ERROR] Aborting rails_mysql | 2020-03-30 23:45:51+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian10 started. rails_mysql | 2020-03-30 23:45:51+09:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config rails_mysql | command was: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_ja_0900_as_cs --verbose --help rails_mysql | 2020-03-30T14:45:51.224692Z 0 [ERROR] Unknown collation: 'utf8mb4_ja_0900_as_cs' rails_mysql | 2020-03-30T14:45:51.227941Z 0 [ERROR] Aborting rails_mysql | 2020-03-30 23:52:21+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.29-1debian10 started. rails_mysql | 2020-03-30 23:52:21+09:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config rails_mysql | command was: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_ja_0900_as_cs --verbose --help rails_mysql | 2020-03-30T14:52:21.488097Z 0 [ERROR] Unknown collation: 'utf8mb4_ja_0900_as_cs' rails_mysql | 2020-03-30T14:52:21.489797Z 0 [ERROR] Aborting ```
T.Adams

2020/03/30 15:01

asahina1979様 ご返答ありがとうございます。初学者ゆえ内容の意味が理解できておりません。container_name: を指定すると、ホスト名に使われるということは、docker-compose.ymlのどの部分をどのように修正すべきという意味でしょうか。linkの部分の「db」が不要ということですかね
退会済みユーザー

退会済みユーザー

2020/03/30 15:03

手っ取り早いのは「container_name」を削除 それ以外はこの回答のやり取りとかでいいはず
T.Adams

2020/03/30 16:48 編集

asahina1979様 ご返答ありがとうございます。一度コンテナを以下のコマンドで削除しました。 $ docker stop $(docker ps -q) $ docker rm $(docker ps -aq) $ docker rmi $(docker images -q) その後、教えていただいた通り、docker-compose.yml内のcontainer_nameが記載された行を削除し、コンテナを作成し、rails db:createを実行しました。以下が結果になります。エラーの内容が変わりました!「Mysql2::Error::ConnectionError: Access denied for user 'root'@'xxx.xx.x.x' (using password: YES)」IPアドレスの部分はxxxで隠蔽させていただきました。取り急ぎ共有させていただきました。引き続き調査を行います!教えて頂きありがとうございました。 ``` Warning: the running version of Bundler (2.1.2) is older than the version that created the lockfile (2.1.4). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.1.4`. /usr/local/bundle/gems/actionpack-6.0.2.2/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call /usr/local/bundle/gems/actionpack-6.0.2.2/lib/action_dispatch/middleware/static.rb:110: warning: The called method `initialize' is defined here Access denied for user 'root'@'xxx.xx.x.x' (using password: YES) Couldn't create 'phase2_development' database. Please check your configuration. rails aborted! Mysql2::Error::ConnectionError: Access denied for user 'root'@'172.18.0.3' (using password: YES) /usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect' ・ ・ (中略) ・ ・ Tasks: TOP => db:create (See full trace by running task with --trace ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問