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

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

ただいまの
回答率

87.59%

dockerで作成したrailsアプリのコンテナからMySQLへ接続ができない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,464

score 40

前提

Docker + Rails + Puma + Nginx + MySQLというQiitaの記事を参考に、AWSのEC2上で、dockerコンテナを作成しています。

分からないこと

docker-compose exec app rails db:createを実行し、Railsアプリから、DBの作成を行うコマンドをEC2上から実行するのですが、ここで以下のエラーが検出されました。この原因がわかりません。

$ docker-compose exec app rails db:create
Access denied for user 'root'@'172.19.0.3' (using password: YES)
Couldn't create 'webapp_development' database. Please check your configuration.
rails aborted!

わかっていること

EC2上から、DBへの接続は可能です。以下のコマンドを使用し、MySQLユーザ、rootm権限を持つMySQLユーザの両者で、ログインができました。

$ docker-compose exec db mysql -u user_name -p 
mysql > 

$ docker-compose exec db mysql -u root -p
mysql >  

少し気になっていること

正しいかわかりませんが、 docker-compose runを実行した際に、Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/と出力されたことが少し気になっています。これが原因でしょうか。
不慣れなもので、yarnをdocker上のコンテナであとからinstallする場合、どのように指示すればよいのかわかっていません。

環境情報

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.28
    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:

以下はRails用のDockerfileです。

FROM ruby:2.7.1

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       apt-utils \
                       nodejs

RUN mkdir /webapp
WORKDIR /webapp

ADD Gemfile /webapp/Gemfile
ADD Gemfile.lock /webapp/Gemfile.lock

RUN bundle install

ADD . /webapp

RUN mkdir -p tmp/sockets

以下は、Nginx用のDockerfileです。

FROM nginx:1.15.8

RUN rm -f /etc/nginx/conf.d/*

ADD nginx.conf /etc/nginx/conf.d/webapp.conf

CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
server {
  listen 80;
  server_name xx.xx.xx.xx; # EC2のElastic IPを指定

  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;
  }
}

以下、わかりやすくするため、拡張子を大文字にしました。

threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('user_name') { 'root' } %>
  password: <%= ENV.fetch('user_password') { 'password' } %>
  host: db

development:
  <<: *default
  database: webapp_development

test:
  <<: *default
  database: webapp_test
MYSQL_ROOT_PASSWORD=db_root_password
MYSQL_USER=user_name
MYSQL_PASSWORD=user_password

dockerコンテナの起動状況は以下です。

$ docker-compose ps
    Name                  Command               State          Ports       
---------------------------------------------------------------------------
webapp_app_1   bundle exec puma -C config ...   Up                         
webapp_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp
webapp_web_1   /bin/sh -c /usr/sbin/nginx ...   Up      0.0.0.0:80->80/tcp 

dockerイメージは以下です。

$ docker-compose images
webapp_app_1   webapp_app   latest   361f62018f81   1.03 GB
webapp_db_1    mysql        5.7.28   db39680b63ac   416 MB 
webapp_web_1   webapp_web   latest   aa805b0e3401   121 MB

その他

  • OS: Amazon linux 2
  • Rails: 6.0.2.2
  • Ruby:2.7.1
  • MySQL: 5.7.28
  • Nginx: 1.15.8
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Access denied for user 'root'@'172.19.0.3' (using password: YES)


と書かれています。DBへのアクセスが拒否され、パスワードが必要と言われています。

DBのパスワードは dbenv に書かれていますね。

ただdatabase.ymlをみると必要な環境変数がdbenvに定義されていなそうです。
database.ymldbenvで定義されているように書き換えてください。

例えば、以下のようになるかと思います。

  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: <%= ENV.fetch('MYSQL_USER') { 'root' } %>
  password: <%= ENV.fetch('MYSQL_PASSWORD') { 'password' } %>

YarnのInstallは、Dockerfileでyarn installを実行してあげてください。

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       apt-utils \
                       nodejs npm &&\
                       npm install -g yarn

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/04 11:21

    ありがとうございます。ymlファイルに記載されているrootユーザのパスワードと、envファイルに記載されているrootユーザのパスワードに差異がありました。正しいものに統一しました。ありがとうございます。yarnに関しては、コンテナ内部に入り直接インストールしましたが、本来は、Dockerfileで実施したほうが楽ですよね。次からそのようにします。

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る