記録用
自作アプリを制作するにあたり、どういったことをしたのか覚えておくために、記録しておく。
参考
【rails環境構築】docker + rails + mysql で環境構築(初心者でも30分で完了!)
[Rails] DockerでRails + MySQLの開発環境をつくる手順
DockerでMysqlへのdb:createに失敗する
dockerでの環境構築
アプリのディレクトリを作るVScodeで開き、そこのターミナルに記述
touch Dockerfile docker-compose.yml Gemfile Gemfile.lock .gitignore
主に5つのファイルが必要。
Dockerfile
FROM ruby:3.2.2
#使用するイメージとバージョン
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
#Railsで開発する時に必要。-qqはエラー以外何も吐かない。-yは全部yesで実行。
RUN mkdir /myapp
WORKDIR /myapp
#作業ディレクトリの設定
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
#左のホスト側を右のコンテナ側にコピー
RUN bundle install
COPY . /myapp
#ホスト側のディレクトリとか全部をコンテナ側にコピー
Gemfile
source 'https://rubygems.org'
ruby '3.2.2'
gem 'rails', '~> 7.0.4.3'
Gemfile.lockは空
docker-compose.yml
#バージョンを書くのは現在では意味がないらしい
services: #アプリケーションを動かすための各要素をserviceと呼ぶ。webとdbと名づける。
db:
image: mysql:latest
ports: #コンテナ内のポート番号をホストの番号にマッピングするという意味。
#コンテナ内のwebサーバにhttp://localhost:3306でアクセスできるようになる
- "3306:3306"
volumes: #データを永続化するためにある。
- ./.data/db:/var/lib/mysql
environment:
MYSQL_USER: root #←ここがエラーの原因
MYSQL_ROOT_PASSWORD: password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
#pidはプロセスIDのこと。server.pidにpidが書かれているとサーバーが起動中と判断されてしまう。
volumes:
- .:/myapp
#dockerとローカルのディレクトリを同期するように設定。実行後、ローカルにも同様のファイルが生成される。
ports:
- "3000:3000"
depends_on:
- db
#依存関係を示している。db→webへと起動する。
ここまで書いたらコマンドを実行
runコマンドではimageも構築から、コンテナの構築・起動までしてくれる。この時点で上記ファイルで書いた、.:/myappによりローカルに同様のファイルが生成される。
docker-compose run web rails new . --force --database=mysql --skip-bundle
コマンドを実行後はいろいろなファイルが作られたり、Gemfileが更新されているのでビルドする。
この時点でdatabase.ymlを書き換えておかなければならないところがある。
database.yml
default: &default
・
・
username: root
password: password ←ここにdocker-compose.ymlで指定したパスワードを入力
host: db ←localhostからdocker-compose.ymlの最下で書いたdbを記入
ローカルのファイルを更新した時はbuildを忘れずに。
docker-compose build
その後にコンテナを起動する。
docker-compose up
するとエラーが出た
ActiveRecord::DatabaseConnectionError
There is an issue connecting with your hostname: db.
Please check your database configuration and ensure there is a valid connection to your database.
解決策
参考の動画の通りに、docker-compose.ymlのdbにMYSQL_USER: rootを記述していたが、rootは指定しなくても作られるらしいので、別のユーザー名を指定するか、いらないなら削除しておかなければならないらしい。
DockerでMysqlへのdb:createに失敗する
その後、別のエラーが出るが、それはデータベースがないというエラーなので作成する。
docker-compose run web rails db:create
再レンダリングすると、ローカルでrailsを開くことができる。