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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby

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

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回答

2967閲覧

【Docker】MySQLへの接続が拒否される。

Kiyobun510

総合スコア12

Ruby

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

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/06/20 08:20

編集2020/06/20 09:58

こちらのQiitaの記事のファイルをコピペして環境構築をしています。
Docker+Rails6+puma+nginx+mysqlの環境構築を目指しております。
DockerでRails newしてコンテナを起動するところまではうまくいったのですが、最後に docker-compose exec app rails db:create を実行すると以下のようなエラーがでてデータベースへの接続が拒否されます。パスワードはあっているはずなのになぜか接続できません。

解決策を教えていただきたいです。

Error

1Mysql2::Error::ConnectionError: Access denied for user 'ユーザー名'@'%' to database 'webapp_development' 2Couldn't create 'webapp_development' database. Please check your configuration. 3rails aborted! 4ActiveRecord::StatementInvalid: Mysql2::Error::ConnectionError: Access denied for user 'ユーザー名'@'%' to database 'webapp_development'

databese.yml

default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch('MYSQL_USER', "root") %> password: <%= ENV.fetch('MYSQL_PASSWORD', "password") %> host: db development: <<: *default database: webapp_development test: <<: *default database: webapp_test

db.env

MYSQL_ROOT_PASSWORD=パスワード MYSQL_USER=ユーザー名 MYSQL_PASSWORD=パスワード

Dockerfile(nginx)

FROM nginx:1.15.8 # インクルード用のディレクトリ内を削除 RUN rm -f /etc/nginx/conf.d/* # Nginxの設定ファイルをコンテナにコピー COPY nginx.conf /etc/nginx/conf.d/webapp.conf # ビルド完了後にNginxを起動 CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

nginx.conf

# プロキシ先の指定 # Nginxが受け取ったリクエストをバックエンドのpumaに送信 upstream webapp { # ソケット通信したいのでpuma.sockを指定 server unix:///webapp/tmp/sockets/puma.sock; } server { listen 80; # ドメインもしくはIPを指定 server_name example.com [or 192.168.xx.xx [or localhost]]; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; # ドキュメントルートの指定 root /webapp/public; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @webapp; keepalive_timeout 5; # リバースプロキシ関連の設定 location @webapp { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://webapp; } }

docker-compose.yml

version: '3' services: app: build: context: . env_file: - ./environments/db.env command: bundle exec puma -C config/puma.rb volumes: - .:/webapp - public-data:/webapp/public - tmp-data:/webapp/tmp - log-data:/webapp/log depends_on: - db db: image: mysql:5.7 env_file: - ./environments/db.env volumes: - db-data:/var/lib/mysql web: build: context: containers/nginx volumes: - public-data:/webapp/public - tmp-data:/webapp/tmp ports: - 80:80 depends_on: - app volumes: public-data: tmp-data: log-data: db-data:

Dockerfile(Rails)

FROM ruby:2.7.1 # リポジトリを更新し依存モジュールをインストール RUN apt-get update -qq && \ apt-get install -y build-essential \ nodejs # yarnパッケージ管理ツールインストール RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && apt-get install -y yarn # Node.jsをインストール RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && \ apt-get install -y nodejs # ルート直下にwebappという名前で作業ディレクトリを作成(コンテナ内のアプリケーションディレクトリ) RUN mkdir /webapp WORKDIR /webapp # ホストのGemfileとGemfile.lockをコンテナにコピー COPY Gemfile /webapp/Gemfile COPY Gemfile.lock /webapp/Gemfile.lock # bundle installの実行 RUN bundle install # ホストのアプリケーションディレクトリ内をすべてコンテナにコピー COPY . /webapp # puma.sockを配置するディレクトリを作成 RUN mkdir -p tmp/sockets

エラー文にPlease check your configuration.とあったのでパスワードの設定がおかしくてエラーが起きていると考え5時間ほど自己解決を試みたのですがわかりませんでした。以下に試したことを記述させていただきます。
##試したこと

  • いったんコンテナ、ボリューム、イメージをすべて削除して再起動
  • db.envのusernameとpasswordの欄に直接パスワードを書いてみる。
  • ボリュームを削除しコンテナを再起動したらコンテナ内からmysqlにルートユーザーで接続に成功しました。

しかし、docker-compose exec app rails db:creatは失敗する。

  • select Host, User, Password from mysql.user; を実行。Passwordを設定したはずなのにPasswordカラムが存在しない。

ご教授いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

処置

docker ボリューム(db-data)を一度削除してから再度docker-compose upしてみてください。
データが削除されますので、予め必要なデータはバックアップしてください

削除コマンド

docker volume rm db-data

https://docs.docker.com/engine/reference/commandline/volume_rm/

理由

まず、mysqlコンテナが初回起動時にdocker-entrypoint.shが実行され、/docker-entrypoint-initdb.d配下のsqlやshが実行され、初期データが投入されます。おおよそ他のDBコンテナ(postgresqlとか)もこのような作りになっています。そうすると起動したDBコンテナを再起動した際にデータが再投入される恐れがあるので、すでに初期データが投入されてたら、/docker-entrypoint-initdb.d配下のデータを投入しないような作りになっています。その初期データが投入されたかどうかの判定はDBのデータ領域にファイルがあるかないかで判断しています。

ここまでがDBコンテナの動きについての説明です。
これを踏まえて、上記のdocker-composeではmysqlのデータ領域をホストにマウントして永続化している。
おそらく初回実行時にそのボリュームに投入されたデータとKiyohumiSanoさんが投入していると思っているデータが異なるからです。(2回目以降のデータは投入されていない)

投稿2020/06/20 11:58

comefigo

総合スコア1051

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

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

Kiyobun510

2020/06/20 12:29

ご回答ありがとうございます。 おっしゃるお通りボリュームを削除してコンテナを再起動したら、コンテナ内からルートユーザーでMySQLに接続できました。 DBコンテナの仕組みについて勉強になりました。感謝いたします。 その後、DBに接続するユーザーに権限を付与(スーパーユーザー)したら、無事db:createで、DB作成に成功いたしました。これで開発がすすめられそうです。
comefigo

2020/06/20 13:01

解決されてよかったです。 この辺のトラブルは誰しも一度は経験するものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問