丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)
と似たような内容になります。
なので詳しく知りたい方はそちらへどうぞ
mysqlのバージョンが異なっていたり、top-level volumesを使っているなど少し異なります
環境
- MacOS 10.15.7
- Docker Desktop for Mac
- Ruby 2.7.1
- Rails 5.2.4.4
- MySQL 8.0.21
$ mkdir rails_docker
$ cd rails_docker
$ vi Dockerfile
Dockerfile
FROM ruby:2.7.1
RUN apt-get update -qq && \
apt-get install -y build-essential \
libpq-dev \
nodejs \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir /recruit_web
ENV APP_ROOT /recruit_web
WORKDIR $APP_ROOT
ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock
RUN bundle install
ADD . $APP_ROOT
$ vi Gemfile
Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 5.2.4', '>= 5.2.4.4'
$ touch Gemfile.lock
$ vi docker-compose.yml
docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0.21
volumes:
- db_data:/var/lib/mysql
networks:
- rails_docker_network
environment:
MYSQL_DATABASE: root
MYSQL_ROOT_PASSWORD: password
# mysql8.0の認証プラグイン(caching_sha2_password)をmysql_native_passwordに変更
command: --default-authentication-plugin=mysql_native_password
container_name: rails_db_container
web:
build: .
depends_on:
- db
command: rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/recruit_web
networks:
- rails_docker_network
ports:
- "3000:3000"
container_name: rails_web_container
volumes:
db_data:
networks:
rails_docker_network:
name: rails_docker_network
# Railsのアプリを作成
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
$ vi /confing/database.yml
database.yml
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root # 追加
password: password # 追加
host: db # 追加
# Dockerfile から Docker Image を作成
$ docker-compose build
# docker-compose.yml を作成したディレクトリで、定義をもとにコンテナ群を構築・起動
$ docker-compose up -d
以下のコマンドを実行するとデータベースが作られてlocalhost:3000でアクセスできると思います
$ docker-compose run web rails db:create
↑コンテナを停止して再起動させる度に実行する必要あり
詰まったところ
docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0.21
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_DATABASE: root
MYSQL_ROOT_PASSWORD: password
# 以下を指定していたらエラーが出た
ports:
- "3306:3306
web:
build: .
command: rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app_sample
ports:
- "3000:3000"
# 以下を指定していたらエラーが出た(非推奨+なくても名前解決されるので必要なかった)
links:
- db
volumes:
db_data:
なぜかlinks と db の公開ポートを指定していると
Mysql2::Error::ConnectionError: Access denied for user 'root'@'172.19.0.4' (using password: YES)
と怒られかなり躓きました。。。
とりあえず、ポートは必要ないと気づき削除
ドキュメントよりlinksは非推奨でなくても名前解決できるそうなので削除
https://docs.docker.com/compose/networking/
何か改善点あればよろしくおねがいしますー