#背景
- railsアプリのdbをsqlightからmysqlに変えようとしていた。
- database.ymlとgemを書き換えた
- bundle installをしたら, 以下のエラーが発生
> An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
> Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling."
#試したこと
1.エラー内容にある通り、gem install~~を実行しても、解決しなかった。
2.ログの確認
> ld: library not found for -lssl
> clang: error: linker command failed with exit code 1 (use -v to see invocation)
で終わっていることを確認。
#先人の知恵を検索
[mysql2 インストール時に 「ld: library not found for -limported_openssl」が表示された場合の対応](https://fkmy.hatenablog.com/entry/2019/10/18/022724 #)
[bundle installでmysql2がエラーになる件](https://qiita.com/SAYJOY/items/dd7c8fc7a3647e7ff969 #)
[mysql2 gemインストール時のトラブルシュート](https://qiita.com/HrsUed/items/ca2e0aee6a2402571cf6 #)
#bundle installできた
$ brew info openss
> For compilers to find openssl@1.1 you may need to set:
> export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
> export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"
$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"
$bundle install
mysqlのユーザーを作成して、ユーザーネームとパスワードを.envとdatabase.ymlに設定する
$ mysql.server stat
$ mysql -uroot
mysql> create user '[user_name]@localhost' indentified by '[password]';
#.env
MYSQL_USER_NAME='[user_name]'
MYSQL_PASSWORD='[password]'
#しかし、Mysqlにコネクトできないエラー発生
$ bundle exec rake db:create
> Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
> Couldn't create 'db_development' database. Please check your configuration.
#####そもそも、datebase.ymlのsocketとは
databaseとwebアプリが通信する先に必要であるらしい
https://stackoverrun.com/ja/q/1099552
"2つのプログラムがネットワーク上でお互いに話をしたい場合には、一つのプログラムは、他の1とのTCP接続(「ソケット」)を開くかもしれません。最初のプログラムは、2番目のコンピュータのIPアドレスとプログラムがリッスンしているポートを知る必要があります。"
"Linuxでは、同じコンピュータ上の2つのプログラムが互いに通信したい場合でも、TCP接続を開くことができます。しかし、彼らはまた、 "ソケットファイル"経由で接続を開くことができます。 LinuxはTCP APIに似たソケットファイルAPIを作成するので、ソケットファイル経由の通信もサポートするためにTCP経由ですでにネットワーク経由で通信しているプログラムを更新するのは大したことではありません。ソケットファイルはTCPより高速ですが、両方のプログラムが同じコンピュータ上にある場合にのみ動作します"
#database.ymlにあるsocketの記述を消すとエラーも消えた
しかし、もう一つのエラーは相変わらず発生している
> Couldn't create 'db_development' database. Please check your configuration.
> Mysql2::Error::ConnectionError: Access denied for user 'ENV["MYSQL_USER_NAME"]'@'localhost' (using password: YES)
#database.ymlでの環境変数の記載方法が間違っていた
#.env
# 変更前
username: ENV["MYSQL_USER_NAME"]
password: ENV["MYSQL_PASSWORD"]
# 変更後
username: <%= ENV["MYSQL_USER_NAME"] %>
password: <%= ENV["MYSQL_PASSWORD"] %>
#無事に”rails db:create”が成功
コンテナ内でも"rails db:create"、成功
bundle exec rspec コマンドも成功
結果、database.ymlはこうなる
default: &default
adapter: mysql2
encoding: utf8
reconnect: false
database: portfolio1_development
pool: 5
username: <%= ENV["MYSQL_USER_NAME"] %>
password: <%= ENV["MYSQL_PASSWORD"] %>
development:
<<: *default
database: portfolio1_development
test:
<<: *default
database: db_test
production:
<<: *default
database: portfolio1_production
username:
ちなみにdocker-compose.ymlはこうなる
version: '3'
services:
web:
build:
context: .
dockerfile: Dockerfile
command: bundle exec rails s -p 3000 -b '0.0.0.0'
tty: true
stdin_open: true
depends_on:
- db
ports:
- "3000:3000"
volumes:
- .:/myapp:delegated
db:
image: mysql:5.7
environment:
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: password
ports:
- '3316:3306'
volumes:
- ./db/mysql/volumes:/var/lib/mysql