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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

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

Ruby on Rails

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

Docker

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

Q&A

解決済

1回答

3688閲覧

DockerでMysqlへのdb:createに失敗する

mikepp

総合スコア11

docker-compose

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

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/16 01:06

編集2020/08/17 07:07

作成中のRailsアプリの開発環境をDockerに移管する際にエラーが発生しました。
ビルドまではできましたが、db:createで以下のエラーが発生しました。

~@yk golfour_aws % docker-compose up -d Pulling db (mysql:8.0)... Status: Downloaded newer image for mysql:8.0 Creating golfour_aws_db_1 ... done Creating golfour_aws_web_1 ... done ~@yk golfour_aws % docker-compose run web bundle exec rake db:create Starting golfour_aws_db_1 ... done Unknown MySQL server host 'db' (-2) Couldn't create 'golfour_development' database. Please check your configuration. rake aborted! Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)

解決方法を探してdocker-compose.ymlとdatabase.ymlを見直しましたが、問題があるようには見えません。
アドバイスいただければ幸いです。よろしくお願いいたします。

開発環境:
Ruby 2.5.1
Rails 5.2.4.3
Mac OS

Dockerfile:

FROM ruby:2.5.1 RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y mysql-client --no-install-recommends && rm -rf /var/lib/apt/lists/* RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs RUN mkdir /workdir WORKDIR /workdir ADD Gemfile /workdir/Gemfile ADD Gemfile.lock /workdir/Gemfile.lock ENV BUNDLER_VERSION 2.1.4 RUN gem install bundler RUN bundle install ADD . /workdir

docker-compose.yml:

version: '3' services: db: image: mysql:8.0 environment: MYSQL_DATABASE: golfour_development MYSQL_ROOT_PASSWORD: password MYSQL_USER: root MYSQL_PASSWORD: password TZ: Asia/Tokyo volumes: - ./mysql/mysql_data:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf ports: - "4306:3306" web: build: context: . dockerfile: Dockerfile 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 ports: - "3000:3000" volumes: - .:/workdir

database.yml:

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> development: <<: *default database: golfour_development username: root password: password host: db test: <<: *default database: golfour_test production: <<: *default database: <%= ENV['DB_NAME'] %> username: <%= ENV['DB_USERNAME'] %> password: <%= ENV['DB_PASSWORD'] %> host: <%= ENV['DB_HOSTNAME'] %>

mysql/my.cnf:

# MySQLサーバーへの設定 [mysqld] # 文字コード/照合順序の設定 character-set-server = utf8mb4 collation-server = utf8mb4_bin # タイムゾーンの設定 default-time-zone = SYSTEM log_timestamps = SYSTEM # デフォルト認証プラグインの設定 default-authentication-plugin = mysql_native_password # エラーログの設定 log-error = /var/log/mysql/mysql-error.log # スロークエリログの設定 slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 5.0 log_queries_not_using_indexes = 0 # 実行ログの設定 general_log = 1 general_log_file = /var/log/mysql/mysql-query.log # mysqlオプションの設定 [mysql] # 文字コードの設定 default-character-set = utf8mb4 # mysqlクライアントツールの設定 [client] # 文字コードの設定 default-character-set = utf8mb4

追記

~@yk golfour_aws % docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------ golfour_aws_db_1 docker-entrypoint.sh mysqld Exit 1 golfour_aws_web_1 /bin/sh -c rm -f /workdir/ ... Up 0.0.0.0:3000->3000/tcp ~@yk golfour_aws % docker-compose logs db Attaching to golfour_aws_db_1 db_1 | 2020-08-16 12:54:40+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started. db_1 | 2020-08-16 12:54:41+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' db_1 | 2020-08-16 12:54:41+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started. db_1 | 2020-08-16 12:55:16+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started. db_1 | 2020-08-16 12:55:17+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' db_1 | 2020-08-16 12:55:17+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started. db_1 | 2020-08-16 13:01:38+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started. db_1 | 2020-08-16 13:01:38+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' db_1 | 2020-08-16 13:01:38+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.

追記

~@yk golfour_aws % docker-compose run web bundle exec rake db:create Starting golfour_aws_db_1 ... done Database 'golfour_development' already exists Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory") Couldn't create 'golfour_test' database. Please check your configuration. rake aborted! Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

追記

docker-composed.yml:

docker

1version: '3' 2services: 3 db: 4 image: mysql:8.0 5 command: --default-authentication-plugin=mysql_native_password 6 environment: 7 MYSQL_ROOT_PASSWORD: password 8 MYSQL_DATABASE: golfour_development 9 MYSQL_USER: yuki 10 MYSQL_PASSWORD: password 11 TZ: Asia/Tokyo 12 volumes: 13 - ./mysql/mysql_data:/var/lib/mysql 14 - ./logs:/var/log/mysql 15 - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf 16 ports: 17 - "4306:3306" 18 web: 19 build: 20 context: . 21 dockerfile: Dockerfile 22 command: /bin/sh -c "rm -f /workdir/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 23 tty: true 24 stdin_open: true 25 depends_on: 26 - db 27 ports: 28 - "3000:3000" 29 volumes: 30 - .:/workdir 31

database.yml:

database.yml

1default: &default 2 adapter: mysql2 3 encoding: utf8 4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 5 6development: 7 <<: *default 8 database: golfour_development 9 username: yuki 10 password: password 11 host: db 12 socket: /tmp/mysql.sock 13 14test: 15 <<: *default 16 database: golfour_test 17 host: db 18 username: yuki 19 password: password 20 socket: /tmp/mysql.sock 21 22production: 23 <<: *default 24 database: <%= ENV['DB_NAME'] %> 25 username: <%= ENV['DB_USERNAME'] %> 26 password: <%= ENV['DB_PASSWORD'] %> 27 host: <%= ENV['DB_HOSTNAME'] %> 28
~@yk golfour_aws % docker-compose run web bundle exec rake db:create Starting golfour_aws_db_1 ... done Can't connect to MySQL server on 'db' (111 "Connection refused") Couldn't create 'golfour_development' database. Please check your configuration. rake aborted! Mysql2::Error::ConnectionError: Can't connect to MySQL server on 'db' (111 "Connection refused")

追記

~@yk golfour_aws % docker-compose run web rails db:migrate Starting golfour_aws_db_1 ... done Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"exec\": executable file not found in $PATH": unknown

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

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

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

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

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

gouf
mikepp

2020/08/17 06:37

ご指摘ありがとうございます。 マルチポストへの理解が足りませんでした。申し訳ございません。 スタックオーバーフローへの投稿は削除し、今後はマルチポストしないよういたします。
guest

回答1

0

ベストアンサー

元の回答

db サービスのコンテナーが停止していませんでしょうか?

参考: docker-composeコマンド実行時の不可解なエラー - Qiita

次のコマンドで db サービスが停止しているかどうかを確認することができます:

console

1docker-compose ps

StateExit になっていたら停止しています

参考: docker-compose ps | Docker Documentation

また、次のコマンドで db サービスが停止した原因を確認することができます:

console

1docker-compose logs db

参考: docker-compose logs | Docker Documentation

追記

根本原因は docker-compose.ymlMYSQL_USERroot を指定していることです

root は指定しなくても作成されるので
ここでは別のユーザー名を指定するか、
もしくは別のユーザーが必要ないのであれば
MYSQL_PASSWORD とともに環境変数を削除し、
ユーザーの作成をやめます

ログが表示されないのは、再起動を繰り返したため
過去のログが流れて最初のエラーが消えてしまっている可能性があります

./mysql/mysql_data を削除して再起動すると
次のようなエラーが表示されます:

console

12020-08-16 13:28:46+09:00 [Note] [Entrypoint]: Creating user root 2ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'

データベースを追加しようとしたところ接続エラーが発生してしまいました。

console

1~@yk golfour_aws % docker-compose run web bundle exec rake db:create 2Starting golfour_aws_db_1 ... done 3Database 'golfour_development' already exists 4Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory") 5Couldn't create 'golfour_test' database. Please check your configuration. 6rake aborted! 7Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")

上記のエラーメッセージは、
「golfour_development は作成済ですが、golfour_test を作ろうとして
ローカルの MySQL にアクセスしようとしましたが、接続用 socket がみつかりませんでした」
という内容です

web コンテナーのローカルには MySQL はないので
db サービスに接続する必要がありますが、
database.yml の設定が、host の設定が development にしかありませんので、
test にも追加しましょう:

diff

1 development: 2 <<: *default 3 database: golfour_development 4 username: root 5 password: password 6 host: db 7 8 test: 9 <<: *default 10 database: golfour_test 11+ host: db

投稿2020/08/16 02:17

編集2020/08/16 12:38
y_shinoda

総合スコア3272

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

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

mikepp

2020/08/16 04:13

ご回答ありがとうございます。 アドバイス内容を実施した部分を質問に追記しました。 アドバイスのおかげでdbが停止していることが分かりました。 ただlogの内容をみても何が問題なのかはわからないのが現状です。
y_shinoda

2020/08/16 04:40

回答に追記しました
mikepp

2020/08/16 05:50

丁寧な回答ありがとうございます。 指摘通りMYSQL_USERをrootから別の名前に変更、database.ymlのusernameも変更して、docker-compose up -d  を実行しましたが、同様のエラーが確認されました。 何度も質問申し訳ございません。
y_shinoda

2020/08/16 07:07

1 ./mysql/mysql_data をディレクトリーごと削除しましたか? 2 同様のエラーはどのエラーメッセージが表示されましたか? 質問欄のエラーメッセージの場合、他に新たに表示されたエラーメッセージはありませんでしたか? 回答欄のエラーメッセージの場合、docker-compose.yml が正しく更新できていない可能性があります
mikepp

2020/08/16 11:04

./mysql/mysql_data の削除をしておりませんでした。 申し訳ございません。 ご指摘通り./mysql/mysql_dataを削除した後、docker-compose up -d  を実行したところデータベースは動くようになりました。 しかし、データベースを追加しようとしたところ接続エラーが発生してしまいました。 ソケット周りの問題だと思うのですが、現在調査中です。 エラーコードは質問に追記しました。
y_shinoda

2020/08/16 12:38

回答に追記しました
mikepp

2020/08/16 14:50

何度も丁寧に回答していただき、本当にありがとうございます。 アドバイス頂いた内容を実施しました。(実施内容は質問に追記しました) アドバイス実施後、db:createしようとしましたが Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory") とのエラーが出てしまいました。
y_shinoda

2020/08/16 18:13

そのエラーは治ったのではありませんか? 質問欄のエラーが出たのですよね? db サービスを起動し直す前に /mysql/mysql_data を削除しましたか? このディレクトリーが残っていると、 環境変数を与えても初期化処理が走らないので環境変数の設定が適用されません
mikepp

2020/08/17 01:47

エラーは質問に追記したものです。 以下の工程を行いました。 /mysql/mysql_data を削除 → docker-composed.ymlとdatabase.ymlをtest環境でのテーブルを作成するように修正。(修正内容は質問の最後に追記しました) → docker-compose up -d を実行 → docker-compose ps でデータベースが起動しているのを確認 → docker-compose run web bundle exec rake db:createを実行 → エラー
y_shinoda

2020/08/17 03:43

こちらで動作確認を行ったところ、問題なく Rails の「Yay! You’re on Rails!」ページが表示されました db:create は、golfour_test の新規作成には失敗します これは、MySQL の一般ユーザーがデータベース新規作成の権限を持たないためです 少なくとも、質問欄のエラーメッセージは表示されません サービスの再起動を行うとき、/mysql/mysql_data に加えて docker-compose down でコンテナーを完全に削除していますか? docker-compose up だけを行っていると、 停止しているコンテナーが再起動して初期化処理が行われない可能性があります
mikepp

2020/08/17 07:08

確認していただき誠にありがとうございます。 docker-compose down実行していませんでした。 docker-compose rm は実行していましたが、ネットワークの削除ができていなかったみたいです。 docker-compose down実行後、db:createでデータベースを作成できました! ありがとうございます。 ただ、最後にdb:migrateを実行しようとしたところエラーが発生しました。 (質問に追記しました。) 現在、原因調査中です。
y_shinoda

2020/08/17 07:12

db:create に回答しており、質問欄、回答欄ともに一杯になってきました ここで質問を新規に立て直しましょう 新たに質問を投稿すると次のようなメリットがあります: - 質問者も回答者も新たにポイントを取得できます - すべての回答者が質問を確認し、回答が得られる確率が上がります - 検索でこの質問にたどり着いた人が質問のタイトルに対するシンプルな回答を得ることができ、質問に高評価が得られやすくなります
mikepp

2020/08/17 08:00

マイグレーションも実行できました! docker-compose run web bundle exec rake db:migrate を実行することでマイグレーション できました。 これで質問に関する内容が解決したので、閉めさせていただきます。 長い間、ご丁寧に解答して頂き本当にありがとうざいました! y_shinodaさんのおかげでここまでこれました。 また質問させていただくことがありましたら、その時はどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問