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

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

新規登録して質問してみよう
ただいま回答率
85.46%
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

解決済

1回答

1680閲覧

railsアプリのdocker環境構築でdocker-compose run web rake db:createできない

N-hiromi

総合スコア6

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つです

1グッド

1クリップ

投稿2021/09/23 09:36

編集2021/09/23 09:38

前提・実現したいこと

docker環境でrailsアプリの環境構築をしていますが、mysqlでデータベースを作成できず困っています。
下記のqitta記事を参考に現在、"2-5 DB作成"をしています。
https://qiita.com/kodai_0122/items/795438d738386c2c1966
環境変数を用いましたところkeyerrorで環境変数が参照できていないことがわかりました。

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

KeyError: key not found: "DB_USERNAME"

該当のソースコード

database.yml

default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('DB_USERNAME') %> password: <%= ENV.fetch('DB_ROOT_PASSWORD') %> host: db development: <<: *default database: okonomiyakidb_development test: <<: *default database: okonomiyakidb_test production: <<: *default database: okonomiyakidb_production username: okonomiyakidb password: <%= ENV['OKONOMIYAKIDB_DATABASE_PASSWORD'] %>

docker-compose.yml

version: '3' volumes: mysql_data: vendor_bundle: services: db: image: "mysql" ports: - "3307:3306" volumes: - "./tmp/db:/var/lib/mysql" environment: MYSQL_ROOT_PASSWORD: <%= ENV.fetch('DB_ROOT_PASSWORD') %> MYSQL_DATABASE: okonomiyaki_db MYSQL_HOST: <%= ENV.fetch('DB_HOST') %> web: build: . tty: true depends_on: - db command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/okonomiyakidb ports: - "3000:3000"

.enb

DB_USERNAME=mysqlにログインして確認したuser名 DB_ROOT_PASSWORD=mysqlにログインして確認したpass DB_HOST=db

試したこと

①.enbはworkingdirectory以下にあります(rails newで生成するappディレクトリの上の階層)。環境変数の使い方を調べてみましたが、他に必要な記述などは見つかりませんでした。

②環境変数を使わずに(.enbの内容をべたうち)docker-compose run web rake db:createをしてみますとconnectionerrorが出てしまいます。

Mysql2::Error::ConnectionError: Access denied for user 'root'@'192.168.112.4' (using password: YES)

mysql -uユーザ名 -pパスワード としてユーザ名とパスワードを確認しましたが正しいようです。mysqlに問題なくログインできました。
mysqlコンテナと、webコンテナ2つが起動した状態でした(logにerrorなし)。
mysqlはrootユーザのみ作成してあり、passwordも設定してあります。

補足情報(FW/ツールのバージョンなど)

Server version: 8.0.26 MySQL
MacBook Pro (13-inch, 2020, Two Thunderbolt 3 ports)
他に必要なコード等あればご指摘ください。docker環境構築は初めてでrailsも半年程度です。
半日調べ続けて見つからない状況です。お忙しい中申し訳ありませんがどなたかご教授いただけますと幸いです。

shinoharat👍を押しています

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

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

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

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

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

shinoharat

2021/09/23 11:41

細かいところまで見れてませんが、とりあえず `.enb` ではなく `.env` ファイルかなと思います。
shinoharat

2021/09/23 11:49

私の勉強不足だったら申し訳ないのですが、 docker-compose.yml で <%= %> を使った変数展開ができるのでしょうか? database.yml で password: <%= ENV.fetch('DB_ROOT_PASSWORD') %> のように書くのは問題ありませんが、 docker-compose.yml では、 MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}" のように書く必要がある気がします。
N-hiromi

2021/09/23 12:18

shinoharat様 毎回御回答くださりありがとうございます。 ご指摘いただいた部分を直すとkeyerrorは解消し、connectionerrorになりました。こちらの原因につきましても何かヒント等いただけると幸いです。
guest

回答1

0

ベストアンサー

まず1つ目に試していただきたいことが、.enb.envにファイル名変更

これでダメでしたら、docker-compose.ymlを下記のように修正

yaml

1version: '3' 2... 3services: 4... 5 web: 6 build: . 7 env_file: # この 8 - .env # 二行を追加 9 tty: true 10...

【追記】
docker-compose.ymlは、database.ymlのようには書けないので、<%= ENV.fetch...は使えないです。
ローカル開発環境ですし、DBユーザはrootでパスワードはなしにしちゃっていいのではないでしょうか?
OKでしたら、下記のように直してみてください。

yaml

1version: '3' 2volumes: 3 mysql_data: 4... 5services: 6 db: 7 image: "mysql" 8 ports: 9 - "3307:3306" 10 volumes: 11# - "./tmp/db:/var/lib/mysql" # ここもついでに 12 - "mysql_data:/var/lib/mysql" # このように直したほうがいいです 13 environment: 14 MYSQL_ALLOW_EMPTY_PASSWORD: "yes" # 元のenvironmentは 15 MYSQL_ROOT_PASSWORD: # すべて削除して 16 MYSQL_DATABASE: okonomiyaki_db # 左の3行にする 17...

.envは下記の3行にする

DB_USERNAME=root DB_ROOT_PASSWORD= DB_HOST=db

投稿2021/09/23 12:16

編集2021/09/24 00:35
mj29

総合スコア136

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

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

N-hiromi

2021/09/23 12:25

mj29様 御回答くださりありがとうございます。keyerrorの原因はファイル名が違うことと、docker-compose.ymlの表記が間違っていることでした。 keyerrorのerrorは解決致しましたが、その後のconnectionerrorが解決できずにいます。もしお時間が許せばこちらも教えていただけますと幸いです。 ありがとうございました。
mj29

2021/09/23 13:21

上に追記しました
N-hiromi

2021/09/24 00:08

御回答ありがとうございます。 ご指摘いただいた部分を修正して、docker-composeのコマンド(downやup -d, run web rake db:create)を行いますと下記のようなerrorが出てしまいます。 ERROR: The Compose file './docker-compose.yml' is invalid because: services.db.environment.MYSQL_ALLOW_EMPTY_PASSWORD contains true, which is an invalid type, it should be a string, number, or a null password不要だとだめということでしょうか? エラー文で調べてみたのですが似たような事例が見つかりませんでした。 インデント等も確認したのですが問題ないです。 よろしくお願い致します。
mj29

2021/09/24 00:38

自分の環境ではうまくいったように思っていたのですが、試しに MYSQL_ALLOW_EMPTY_PASSWORD: "yes" という感じで、yesをダブルクォーテーションで括ってもらえますでしょうか? それから、本文に追記で、最新のdocker-compose.ymlをのせてもらえれば何かわかるかもしれません。
mj29

2021/09/24 00:58

よかったですっ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問