【Docker】MySQLへの接続が拒否される。
- 評価
- クリップ 0
- VIEW 706
こちらのQiitaの記事のファイルをコピペして環境構築をしています。
Docker+Rails6+puma+nginx+mysqlの環境構築を目指しております。
DockerでRails new
してコンテナを起動するところまではうまくいったのですが、最後に docker-compose exec app rails db:create
を実行すると以下のようなエラーがでてデータベースへの接続が拒否されます。パスワードはあっているはずなのになぜか接続できません。
解決策を教えていただきたいです。
Mysql2::Error::ConnectionError: Access denied for user 'ユーザー名'@'%' to database 'webapp_development'
Couldn't create 'webapp_development' database. Please check your configuration.
rails aborted!
ActiveRecord::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カラムが存在しない。
ご教授いただけますと幸いです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
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回目以降のデータは投入されていない)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/06/20 21:29
おっしゃるお通りボリュームを削除してコンテナを再起動したら、コンテナ内からルートユーザーでMySQLに接続できました。
DBコンテナの仕組みについて勉強になりました。感謝いたします。
その後、DBに接続するユーザーに権限を付与(スーパーユーザー)したら、無事db:createで、DB作成に成功いたしました。これで開発がすすめられそうです。
2020/06/20 22:01
この辺のトラブルは誰しも一度は経験するものです。