LoginSignup
0
1

More than 3 years have passed since last update.

docker-composeでのRails5+MySQL8.0+top-level volumesの環境構築

Last updated at Posted at 2020-10-10

丁寧すぎる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/

何か改善点あればよろしくおねがいしますー

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1