railsアプリをec2を利用して本番環境でデプロイした際に、dockerを導入してみました。
ec2にdocker及びdocker-composeをインストールするには以下を参考にしました。
ec2にsshログインし、mysqlにマイグレーションするまでは以下が詳しく書いてあります。
MySQLの設定以降
amazon linuxではデフォルトがmariadbのため以下のエラーが出ます。
$ sudo service mysqld start
Redirecting to /bin/systemctl start mysqld.service
Failed to start mysqld.service: Unit not found.
該当する方は以下を参考にmysqlをインストールしてください。
また、ここまで手順どおり進めても以下のコマンドでエラーが出ます。
$ rake db:create RAILS_ENV=production
rake db:migrate RAILS_ENV=production
rake aborted!
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (2)
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
こちらはdockerの導入のためにdatabase.ymlの設定を以下のように変更したためです。
host: localhost #変更前
host: db #変更後
そのため、データベースの作成にはdockerコマンドで実行する必要があります。
しかし、dockerコマンドを実行しようとすると以下のエラーになります。
ERROR: Couldn’t connect to Docker daemon at http+docker://localhost – is it running?
権限不足によるエラーのため、以下を参考に権限を変更してください。
https://qiita.com/dnnnn_yu/items/14a31721a2870b735938
ここまで進んだらdockerコマンドが使用できると思いますので以下のコマンドを実行して下さい。
$ docker-compose up -d コンテナの作成(バックグラウンドで起動モード)
$ docker ps -a 起動しているかの確認
データベースを作成しようとするとエラーが出ます。
$ docker-compose run web rails db:create RAILS_ENV=production
Mysql2::Error::ConnectionError: Access denied for user 'root'@'172.18.0.5' (using password: NO)
これは参考サイトでdatabase.ymlのproduction環境のpasswordが設定されていないからです。
以下のように設定してあげましょう。
// database.yml
production:
<<: *default
host: <%= ENV['DB_HOST'] %>
database: <%= ENV['DB_DATABASE'] %>
username: <%= ENV['DB_USERNAME'] %>
password: <%= ENV['DB_PASSWORD'] %>
これでデータベースの作成ができると思います。
$ docker-compose run web rails db:create RAILS_ENV=production