Ruby 2.6.6 / Rails 6.0.3 / MySQL 8.0.19の開発環境をDockerで構築
概略
- Dockerfileを作成
- docker-compose.ymlを作成
- Gemfile,Gemfile.lockを作成
- イメージ・コンテナの作成
- Rails初期設定
手順
まずは、アプリケーションのルートディレクトリを作り、その中で作業しますよ。
$ mkdir my_application
Dockerfile
下記の内容でDockerfileを作成します。
# イメージのベースラインにRuby2.6.6を指定 FROM ruby:2.6.6 # Railsに必要なパッケージ等をインストール RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update -qq && apt-get install -y --no-install-recommends build-essential nodejs curl git mariadb-client yarn RUN gem install bundler # ディレクトリを指定 ENV INSTALL_PATH /app RUN mkdir $INSTALL_PATH WORKDIR $INSTALL_PATH # ローカルのGemfileとGemfile.lockをコピー COPY ./Gemfile /app/Gemfile COPY ./Gemfile.lock /app/Gemfile.lock # Gemのインストール実行 RUN bundle install # カレントディレクトリの内容をコピー COPY . . # http通信用に3000ポートを使用するっていうメモ EXPOSE 3000
ruby2.6系をベースイメージに使ったとき、インストールするyarnのバージョンが都合悪い(?)らしく、 よくわかってないですがインストールページhttps://dl.yarnpkg.com/debian/から目的のバージョンを持ってきてます。
参考にした記事 https://qiita.com/me-654393/items/ac6f61f3eee66380ecd7
docker-compose.yml
docker-composeはこんな感じにしました。
# docker-compose.ymlフォーマットのバージョン指定 version: '3.8' services: # Railsコンテナ定義 web: # Dockerfileを使用してイメージをビルド build: . # ポート3000が来たらrailsサーバーが応答 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" # ローカルのsrcをコンテナにマウント volumes: - .:/app ports: - 3000:3000 # dbコンテナが先に起動するよう設定 depends_on: - mysql tty: true stdin_open: true # Webpackerコンテナ定義 webpacker: <<: *app_base command: bash -c "rm -rf public/packs && bin/webpack-dev-server" ports: - 3035:3035 # MySQLコンテナ定義 mysql: # mysqlを使用してコンテナ作成 image: mysql:8.0.19 command: --default-authentication-plugin=mysql_native_password volumes: # データストアからマウント - ./tmp/mysql:/var/lib/mysql # コンテナ内の環境変数を定義 environment: # mysqlのルートユーザーのパスワード設定(任意のパスワード) MYSQL_ROOT_PASSWORD: password ports: - "3306:3306" restart: always
MySQL8系を使うとき、ユーザーの認証方式が変わって"caching_sha2_password"という設定値がデフォになっているので、 開発環境としては特に拘らないので5系までと同じ設定"mysql_native_password"にしています。
Gemfile
下記のコマンドでGemfileを生成できる。
$ bundle init
Railsの目的のバージョンのみ書いておきます。
# frozen_string_literal: true source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.6.6' gem 'rails', '~> 6.0.3'
Gemfile.lockは空で作っておきます。
$ touch Gemfile.lock
コンテナのビルド
あとはRailsのプロジェクトを作成して、ビルド。 できたら起動します。
$ docker-compose run web rails new . --force --database=mysql $ docker-compose build $ docker-compose up
Railsの初期設定
config/database.ymlを編集します。
default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: password # ここはDockerfileに設定した値 host: mysql # ここはdocker-compose.ymlに設定した名前
下記のコマンドでコンテナの中に入れますので、 DBを作成します。
$ docker exec -it my_application_web_1 bash /app# bundle exec rake db:create
実行確認
http://localhost:3000/にアクセス。 地球に人間が乗っていたらサクセス。