nozominozonozo
@nozominozonozo

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Docker × MySQL】が接続できません

解決したいこと

【Docker / Ruby / MySQL】にて環境構築を行なっています。
以下コマンドを実行した際に表示されるエラーを解決したいです。

Docker:20.10.5
Docker-compose:1.29.0
Ruby:2.6.5
Rails:6.0.3.6
MySQL:5.6.50

発生している問題・エラー文

ActiveRecord::ConnectionNotEstablished
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

ググると同じような記事はあり、参考にコマンド実行してみたが解決できず。

ソースコード

docker-compose.yml

version: '3'
services:
  db:
    image: mysql:5.6.50
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3316:3306'
    volumes:
      - ./db/mysql/volumes:/var/lib/mysql


  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db


entrypoint.sh

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"       

Dockerfile

FROM ruby:2.6.5
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client

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

RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - && \
  apt-get install nodejs

RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

database.yml

# MySQL. Versions 5.5.8 and up are supported.
#
# Install the MySQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html
#
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: localhost

development:
  <<: *default
  database: original_app_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: original_app_test

# As with config/credentials.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password or a full connection URL as an environment
# variable when you boot the app. For example:
#
#   DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# If the connection URL is provided in the special DATABASE_URL environment
# variable, Rails will automatically merge its configuration values on top of
# the values provided in this file. Alternatively, you can specify a connection
# URL environment variable explicitly:
#
#   production:
#     url: <%= ENV['MY_APP_DATABASE_URL'] %>
#
# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full overview on how database connection configuration can be specified.
#
production:
  <<: *default
  database: original_app_production
  username: original_app
  password: <%= ENV['ORIGINAL_APP_DATABASE_PASSWORD'] %>

自分で試したこと

MySQL自体にローカルでも接続ができなくなったので再インストールするとローカルは改善。
mysql -u root 実行すると入れるのでサーバー系の問題ではない気がする。
docker-compose up (down)ともにdoneしているので問題なさそうです。

0

3Answer

Comments

  1. @nozominozonozo

    Questioner

    @github0013@githubさん
    ご回答ありがとうございます。
    database.yaml追記しております。ご確認ください。
  host: localhost

だからじゃないかなと。

docker-compose使ってて、networkも特に設定がないところを見ると、railsからmysqlはservice名のdbで通信ができるはずです。

railsのコンテナに入って、ping dbが通るかどうか試してみてください。

rails内でデータベースのホストがlocalhostって言うことはそれ自身=つまりrailsのサーバーということになり、railsのサーバーにmysqlは入っていないのでCan't connect to local MySQL server

$ docker-compose up -d

$ docker ps

...
... ここで出てくるコンテナ名を下に
...

$ docker exec -it コンテナ名 bash 

# コンテナに入ったら
$ ping db
0Like

自分も最初相当迷ったんですが、よくある参考サイトの書き方のように

  1. Dockerfileを完璧に書いて
  2. docker-composeも完璧に書いて
  3. いきなり全部全て動かす環境を作る

みたいな離れ業はちゃんと構成全体像が理解できていないと出来るわけないので

  1. ほぼ空のDockerfileから始める(FROMだけからでも)
  2. docker-composeでvolumeを設定してローカル編集が反映できるようにしておく(tty: trueがあったほうが良い)
  3. コンテナに入って動かしてみて、必要ならライブラリを追加していく
  4. 追加したライブラリなどはDockerfileに忘れないようにRUNコマンドで書いておく
  5. 最終的にdocker-composeのvolume、command、entrypointが無くてもdockerイメージ内にすべてが内包される状態まで持っていく

みたいにした方が理解が早いし、楽だと思います。
とにかくコンテナ内に入って作業してみて、普段と何ら変わらないlinuxを動かしている感覚がつかめれば早いと思います。

0Like

Your answer might help someone💌