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

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の基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

4638閲覧

docker-compose で rails から mysql に接続できない

naserehari

総合スコア35

docker-compose

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

MySQL

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/09 04:59

編集2020/10/09 05:28

前提・実現したいこと

Mac に brew install mysql した環境で Rails の開発をしています。
これを Docker化したいので Dockerfile と docker-compose.yml を書きました。

docker-compose up で起動し、 localhost:3000 にアクセスすると Mysql2::Error が出ます。

発生している問題・エラーメッセージ

Mysql2::Error Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

該当のソースコード

yml

1# docker-compose.yml 2version: '3' 3services: 4 db: 5 image: mysql:5.7 6 environment: 7 MYSQL_USER: root 8 MYSQL_ROOT_PASSWORD: password 9 ports: 10 - '3306:3306' 11 volumes: 12 - ./db/mysql/volumes:/var/lib/mysql 13 14 15 web: 16 build: . 17 environment: 18 MYSQL_ROOT_PASSWORD: password 19 command: bundle exec rails s -p 3000 -b '0.0.0.0' 20 volumes: 21 - .:/myapp 22 ports: 23 - "3000:3000" 24 depends_on: 25 - db

yml

1# config/database.yml 2default: &default 3 adapter: mysql2 4 5 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 6 username: root 7 password: <%= ENV.fetch('MYSQL_ROOT_PASSWORD', '') %> 8 # socket: /var/lib/mysql/mysql.sock 9 # socket: /var/run/mysqld/mysqld.sock 10 host: <%= ENV.fetch('DB_HOST', '') %>

試したこと

docker-compose up のログ出力を見ていると sock ファイルは /var/run/mysqld/mysqld.sock となっています。

db_1 | Version: '5.7.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

しかし、ネットでググってみると /var/lib 配下に sock ファイルは作られるようです。
たしかに volume は /var/lib/mysql をしているのでこれでは参照できませんよね。

質問

なぜ、mysqld はデフォルトで /var/lib/mysql/mysql.sock ではなく、 /var/run/mysqld/mysqld.sock を参照しているのでしょうか?
rails からDBにアクセスさせるにはどうしたらいいでしょうか?

追記: あー、もしかしてコンテナ間通信に sokcet ファイルは関係ないのかも。 socket ファイルを共有する手もあるけど host 指定して接続するやり方もあるっぽい。

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

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

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

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

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

firegrape

2020/10/09 05:48

/var/log/mysqld.log こちらは見られましたでしょうか?
guest

回答1

0

ベストアンサー

config/database.yml:

yaml

1 host: <%= ENV.fetch('DB_HOST', '') %>

環境変数 DB_HOST が設定されていないため上記の箇所の指定がなされず
localhost にデータベースを探しに行っています

たとえば、次のようにすると少なくともこのエラーは解消します
docker-compose.yml:

diff

1version: '3' 2services: 3 db: 4 image: mysql:5.7 5 environment: 6 MYSQL_USER: root 7 MYSQL_ROOT_PASSWORD: password 8 ports: 9 - '3306:3306' 10 volumes: 11 - ./db/mysql/volumes:/var/lib/mysql 12 13 14 web: 15 build: . 16 environment: 17+ DB_HOST: db 18 MYSQL_ROOT_PASSWORD: password 19 command: bundle exec rails s -p 3000 -b '0.0.0.0' 20 volumes: 21 - .:/myapp 22 ports: 23 - "3000:3000" 24 depends_on: 25 - db

投稿2020/10/09 05:57

y_shinoda

総合スコア3272

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

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

naserehari

2021/03/18 15:11

回答が遅くなりましたが意味を理解しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問