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

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

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

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

MySQL

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

Ruby on Rails

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

Docker

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

Q&A

解決済

2回答

1647閲覧

DockerとMySQLのコネクションの解消法について

ts21

総合スコア32

docker-compose

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

MySQL

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

Ruby on Rails

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

Docker

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

0グッド

0クリップ

投稿2020/08/27 17:09

編集2020/08/28 05:01

##Dockerを用いてRailsをビルドしたい
以下の4つのファイルを設定して、Railsでローカルサーバをビルドしようとしています。
Dockerのバージョンはv19.03.12です

Dockerfile

FROM ruby:2.5.0 ENV LANG C.UTF-8 RUN apt-get update -qq && apt-get install -y build-essential mysql-client nodejs RUN gem install bundler WORKDIR /tmp ADD Gemfile Gemfile ADD Gemfile.lock Gemfile.lock RUN bundle install ENV APP_HOME /app RUN mkdir -p $APP_HOME WORKDIR $APP_HOME ADD . $APP_HOME

docker-compose.yml

version: '2' services: web: build: context: . dockerfile: ./docker/Dockerfile container_name: "app_web" command: bash -c "rake db:create && rake db:migrate && bundle exec rails s" ports: - "3000:3000" volumes: - .:/app environment: RAILS_ENV: development DOCKER_HOST_IP: host.docker.internal # DOCKER_HOST_IP: docker.for.mac.host.internal tty: true stdin_open: true

docker-compose2.yml

version: '2' services: app: build: context: . dockerfile: ./Dockerfile entrypoint: /wait-for-it.sh -t 180 -s db:3306 -s db-test:3306 -- command: bash -c "rake db:create && rake db:migrate && bundle exec rails s" ports: - ${APP_PORT}:3000 volumes: - .:/app - ./docker/wait-for-it.sh:/wait-for-it.sh environment: RAILS_ENV: development MYSQL_HOST: db MYSQL_TEST_HOST: db-test MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_DATABASE: app env_file: - .env tty: true stdin_open: true db: image: mysql:5.7 # volumes: # - ./tmp/mysql-data:/var/lib/mysql ports: - ${DB_PORT}:3306 environment: MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: app TZ: Asia/Tokyo env_file: - .env command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci db-test: image: mysql:5.7 ports: - ${DB_TEST_PORT}:3306 environment: MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: app_test TZ: Asia/Tokyo env_file: - .env command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

docker-start.sh

rm tmp/pids/server.pid docker-compose up -d docker start app_web docker attach app_web

config/database.yml

default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch("MYSQL_USER") { 'root' } %> password: <%= ENV.fetch("MYSQL_PASSWORD") { '' } %> host: <%= ENV.fetch('MYSQL_HOST') { ENV['DOCKER_HOST_IP'] } %> development: <<: *default database: <%= ENV.fetch('MYSQL_DATABASE') { 'app_development' } %> test: <<: *default host: <%= ENV.fetch('MYSQL_TEST_HOST') { ENV['DOCKER_HOST_IP'] } %> database: app_test production: <<: *default host: app.cgbybcmani5q.ap-northeast-1.rds.amazonaws.com database: app username: root password: <%= ENV['APP_DATABASE_PASSWORD'] %>

##エラー
コマンドから sh docker-start.sh を実行するとビルドできるはずなのですが
Mysql関連でエラーが出て困っています。

エラーメッセージ

% sh docker-start.sh rm: tmp/pids/server.pid: No such file or directory Starting app_web ... done app_web Can't connect to MySQL server on 'host.docker.internal' (111 "Connection refused") Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8mb4", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"host.docker.internal", "database"=>"app_development"} rake aborted! Mysql2::Error: Can't connect to MySQL server on 'host.docker.internal' (111 "Connection refused") /usr/local/bundle/gems/mysql2-0.4.10/lib/mysql2/client.rb:89:in `connect' /usr/local/bundle/gems/mysql2-0.4.10/lib/mysql2/client.rb:89:in `initialize' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `new' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/mysql2_adapter.rb:22:in `mysql2_connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:809:in `new_connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `checkout_new_connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:832:in `try_to_checkout_new_connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:793:in `acquire_connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:521:in `checkout' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:380:in `connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:1008:in `retrieve_connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_handling.rb:118:in `retrieve_connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/connection_handling.rb:90:in `connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/mysql_database_tasks.rb:6:in `connection' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/mysql_database_tasks.rb:14:in `create' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/database_tasks.rb:119:in `create' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/database_tasks.rb:139:in `block in create_current' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/database_tasks.rb:316:in `block in each_current_configuration' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/database_tasks.rb:313:in `each' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/database_tasks.rb:313:in `each_current_configuration' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/tasks/database_tasks.rb:138:in `create_current' /usr/local/bundle/gems/activerecord-5.2.0.rc1/lib/active_record/railties/databases.rake:29:in `block (2 levels) in <main>' /usr/local/bundle/gems/rake-12.3.0/exe/rake:27:in `<top (required)>' Tasks: TOP => db:create (See full trace by running task with --trace)

##やったこと
エラーを調べてみると、ローカルのMysql2とDockerの間でコネクションができていないようです。
そもそも、Mysqlのイメージを使用しているのでローカルは関係ないと思うのですが、zshenvに環境変数を
設定する必要でもあるのでしょうか?

##追記
docker-compose -f docker-compose.yml up 実行の場合は上記エラーメッセージが出力されます

% docker-compose -f docker-compose2.yml up の実行ログは以下の通りです。
%docker-compose -f docker-compose2.yml run --rm app bash -c "rake db:create && rake db:migrate && bundle exec rails s"
も同様のログとなります

WARNING: The APP_PORT variable is not set. Defaulting to a blank string. WARNING: The DB_PORT variable is not set. Defaulting to a blank string. WARNING: The DB_TEST_PORT variable is not set. Defaulting to a blank string. ERROR: The Compose file './docker-compose2.yml' is invalid because: services.app.ports is invalid: Port ranges don't match in length services.db.ports is invalid: Port ranges don't match in length services.db-test.ports is invalid: Port ranges don't match in length

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

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

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

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

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

y_shinoda

2020/08/27 17:45

Rails の config/database.yml を追記お願いします
ts21

2020/08/28 02:17

ご返信いただき感謝します。 ファイルを追加いたしました
guest

回答2

0

ベストアンサー

おそらく先に

console

1docker-compose -f docker-compose2.yml up

などとして docker-compose2.yml で定義されているサービスのコンテナーを起動した後に
docker-start.sh を実行されていると思いますので、
その前提での回答となります

原因

ユーザー: root, パスワード: なしで接続しようとして、
データベース側のパスワードと一致せず、データベースへのログインに失敗しています:

console

1Can't connect to MySQL server on 'host.docker.internal' (111 "Connection refused") 2Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8mb4", "pool"=>5, "username"=>"root", "password"=>nil, "host"=>"host.docker.internal", "database"=>"app_development"}

解説

ログでは

console

1"database"=>"app_development"

と出力されているので、config/database.yml の設定の内、
development の設定が利用されています

データベース接続には次の設定が使われます:

yaml

1default: &default 2 adapter: mysql2 3 encoding: utf8mb4 4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 5 username: <%= ENV.fetch("MYSQL_USER") { 'root' } %> 6 password: <%= ENV.fetch("MYSQL_PASSWORD") { '' } %> 7 host: <%= ENV.fetch('MYSQL_HOST') { ENV['DOCKER_HOST_IP'] } %> 8 9development: 10 <<: *default 11 database: <%= ENV.fetch('MYSQL_DATABASE') { 'app_development' } %>

これらの設定のほとんどが、
環境変数が設定されていなければ既定値を使うように定義されています

docker-start.sh で起動する docker-compose.ymlweb サービスには
環境変数が次の内容しか定義されていません:

yaml

1 environment: 2 RAILS_ENV: development 3 DOCKER_HOST_IP: host.docker.internal

よって、データベース接続の設定は config/database.yml の既定値が使われます
ユーザー: root, パスワード: なしで接続を試みることになります

しかし、接続先のデータベースのサービスは
db であっても db-test であっても
ユーザー: root のパスワードは MYSQL_ROOT_PASSWORD: rootpassword として
rootpassword が設定されています:

yaml

1 db: 2 image: mysql:5.7 3 # volumes: 4 # - ./tmp/mysql-data:/var/lib/mysql 5 ports: 6 - ${DB_PORT}:3306 7 environment: 8 MYSQL_USER: user 9 MYSQL_PASSWORD: password 10 MYSQL_ROOT_PASSWORD: rootpassword 11 MYSQL_DATABASE: app 12 TZ: Asia/Tokyo 13 env_file: 14 - .env 15 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 16 17 db-test: 18 image: mysql:5.7 19 ports: 20 - ${DB_TEST_PORT}:3306 21 environment: 22 MYSQL_USER: user 23 MYSQL_PASSWORD: password 24 MYSQL_ROOT_PASSWORD: rootpassword 25 MYSQL_DATABASE: app_test 26 TZ: Asia/Tokyo 27 env_file: 28 - .env 29 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

このため、接続に失敗します

ちなみに、ほぼ有り得ないと思いますが、
./docker/Dockerfile 内で ENV 命令で MySQL のパスワードなどを指定していればこの限りではありません

解決方法

もし、app サービスと web サービスを分ける特別な理由がなければ、
次のコマンドでマイグレーションが実行できるでしょう

console

1docker-compose -f docker-compose2.yml run --rm app bash -c "rake db:create && rake db:migrate && bundle exec rails s"

そうすると、Compose ファイルを複数設ける必要がなくなり、
コマンドで -f オプションで Compose ファイルを指定する必要もなくなります

投稿2020/08/28 03:59

y_shinoda

総合スコア3272

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

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

ts21

2020/08/28 05:06

申し訳ございません。コンテナの起動(docker-compose)を行わずにsh docker-start.shを実行していました
ts21

2020/08/28 05:08

ご回答に即して、docker-composeを実行してみるとポート周りのエラーが追記しておりますとうり出ていました。
guest

0

コンテナの立ち上がる順番に問題はないでしょうか?

diff

1version: '2' 2services: 3 app: 4 build: 5 context: . 6 dockerfile: ./Dockerfile 7 entrypoint: /wait-for-it.sh -t 180 -s db:3306 -s db-test:3306 -- 8 command: bash -c "rake db:create && rake db:migrate && bundle exec rails s" 9 ports: 10 - ${APP_PORT}:3000 11 volumes: 12 - .:/app 13 - ./docker/wait-for-it.sh:/wait-for-it.sh 14 environment: 15 RAILS_ENV: development 16 MYSQL_HOST: db 17 MYSQL_TEST_HOST: db-test 18 MYSQL_USER: user 19 MYSQL_PASSWORD: password 20 MYSQL_DATABASE: app 21 env_file: 22 - .env 23 tty: true 24 stdin_open: true 25+ depends_on: 26+ - db 27

Control startup and shutdown order in Compose | Docker Documentation

投稿2020/08/27 23:47

naokit-dev

総合スコア424

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問