[Rails&Docker&MySQLの環境構築]　コンテナ起動したが、MySQLが見つからない...?

# 概要

ポートフォリオ制作真っ最中です。
最初の環境構築で早速躓いてしまったので、備忘録の意味も含めて書きます。
初心者で同じところで躓いてしまった方に届けば嬉しいです。
※誤りなどあれば、コメントくださると嬉しいです。

# 今までのフロー

* Dockerfileを作成
* docker-compose.ymlを作成
* config/database.ymlの環境変数を修正
* `$docker-compose up`で、こちらのエラー...

> ***Could not find gem 'mysql2 (>= 0.4.4)' in any of the gem sources listed in your Gemfile.***

# 解決法

①MySQLをローカルにインストール
②bundle install
③Gemfile.lockができたこと確認

# 原因


根本原因は、以前MySQLをローカルにインストールしたときに環境を汚していたことでした。
ソケットや権限に問題あり、`bundle install`でうまくMySQLを引っ張ってこれなかったぽいです。

そのため、一旦MySQLのディレクトリを全て削除して再度ローカルにMySQLをインストール。
その後`bundle install`した形です。

Gemfile.lockがうまく機能していなかったので、`docker-compose up`してもmysql引っ張ってこれませんでした。
そういえば、`bundle install`してもgemfile.lockは作成されてませんでした。(泣)

rails×dockerはそういったローカルの状態が影響を与えうるとのことです。
勉強になりました。

## 以下、環境/経緯などです。
# 作成ファイル
Dockerfileとdocker-compose.ymlはこんな感じです。

```dockerfile:Dockerfile
#Rubyを使用
FROM ruby:2.6.6

#文字コードをUTF-8に設定
ENV LANG C.UTF-8

#TimeZoneを日本に設定
ENV TZ Asia/Tokyo

#ルート直下にappディレクトリを作成
RUN mkdir /app

#作業ディレクトリに/appを指定して移動
WORKDIR /app

#HostのGemfileを共有
COPY Gemfile /app/Gemfile

#各種パッケージをインストール
#libpq: GemにてMySQLを導入するために必要
#sudo: 権限変更管理
#bundler(Gemfileに記載されたパッケージをインストールする仕組み)をインストール
RUN apt-get update -qq && apt-get install -y build-essential \
	libpq-dev \
	sudo \
	&& gem install bundler:2.0.1

#Gemfileに記載されたパッケージをインストール
#Gemfileにはrails 6.0.3'が記載されている
RUN bundle install

#/appとカレントディレクトリを共有
COPY . /app

```

(コメントだらけで逆に見づらいという。。。)

```yaml:docker-compose.yml
version: "3"

#dbとbackendのコンテナを作成
services:
  db:
    container_name: db
    #DockerHubにアップされているイメージをプル
    image: mysql:latest
    #環境変数設定
    environment: 
      TZ: Asia/Tokyo #Dockerfileと同様にTimeZoneを設定
      MYSQL_DATABASE: linpy_database #データベース名を設定
      MYSQL_ROOT_PASSWORD: ***** #ルートユーザーのパスワードを設定
      MYSQL_USER: ***** #使用ユーザーを定義
      MYSQL_PASSWORD: ***** #上記ユーザーのパスワードを設定
    #マウントする設定ファイルのパスを指定
    volumes:
      - mysql_data:/var/lib/mysql
    #ポートを設定
    ports:
      - 3307:3306
    #IPアドレスを設定
    networks:
      app_net: #後述のapp_netネットワーク空間の以下のIPを使用するよう設定
        ipv4_address: '172.20.0.2'

  backend:
    container_name: backend
    #ComposeFileを実行し、ビルドされるときのpathを指定
    build: ./backend/
    image: backend
    #gemを動かしてサーバー立ち上げし、0.0.0.0にバインドしてフルアクセスできるようにする
    command: bundle exec rails server -b 0.0.0.0
    #コンテナの常時起動
    tty: true
    #入力のインターフェースを起動 docker run -itのitと同義
    stdin_open: true
    
    #バックエンドはcashe, temp, log, gitにもマウント
    volumes:
      - ./backend:/app:cached
      - bundle_data:/usr/local/bundle:cached
      - /app/vendor
      - /app/tmp
      - /app/log
      - /app/.git
    environment:
      TZ: Asia/Tokyo
    
    #起動順を制御, dbの後
    depends_on:
      - db
    ports:
      - 5000:3000 # ポートフォワード
    networks:
      app_net:
        ipv4_address: '172.20.0.3'


#独自のネットワークを設定
networks:
  #app_netというネットワーク空間を定義
  app_net:
    driver: bridge #bridgeネットワークへ接続
    ipam: #IP設定
      driver: default
      config:
        - subnet: 172.20.0.0/24 #Subnetを定義

#2つのvolumeを定義
volumes:
  mysql_data:
  bundle_data:
```

```ruby:Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.6'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.3'
# Use mysql as the database for Active Record
gem 'mysql2', '>= 0.4.4'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
# gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false

# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
# gem 'rack-cors'

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'listen', '~> 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]


```

てなわけなんですが、足りないgemがある...?
`bundle install`しているのに...
`docker-compose build`した際は、これが出てました。

```
Fetching mysql2 0.5.3
Installing mysql2 0.5.3 with native extensions
```




# 解決できなかった方法

#### NG1: 魔法の言葉とやらを追記してみる

Dockerfileの`RUN bundle install`の前に以下を追記してみる。
魔法の言葉：`bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib" \`
だめでした。。。

#### NG2: キャッシュクリアしてみる

`docker-compose build --no-cache`でビルドした後、`docker-compose up`したが、
だめでした。。