hiro_katoの競プロ精進記録

非情報系30歳が競技プログラミングを始めるとどうなるか?

【Docker】Ruby on Rails の環境構築(Win10・2018/12版)

競技プログラミングの精進記録と銘打って,なぜ環境構築なの?

  • AtCoderで精進するときに役立つWebアプリを作ってみたいと思ったからです.

今回の内容

  • Linux系の環境が手持ちでなかったため,
    docker-compose1,2を使ってRuby on Railsの環境を構築しました(Mac買えば(ry).
  • 公式ドキュメント3と先人の解説ブログ4を参考にしています.
    公式ドキュメントから変更した設定を中心に記事を書きました.
  • RubyRuby on Railsだけでなく,Dockerも初学者です.
    お気づきの点がありましたら,コメントなどでご指摘いただけると幸いです.

開発環境

ローカル環境

  • Windows10 Pro Version 1803
  • Docker for Windows Version 18.09.0

作成した環境

主な変更点

手順

docker-compose run web rails new . --force --database=mysql --skip-bundle
  • docker-compose buildを実行
docker-compose build
  • データベースに接続
    • config/database.ymlを一部書き換え
docker-compose up
docker-compose run web rails db:create

設定ファイル

Dockerfile

FROM ruby:2.5.3
RUN apt-get update -qq && apt-get install -y build-essential mysql-client node.js
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'
gem 'rails', '5.2.1.1'

Gemfile.lock




docker-compose.yml

version: '3'
services:
  db:
    image: mysql:8.0.13
    volumes:
      - ./tmp/db:/var/lib/mysql
      - ./mysql-confd:/etc/mysql/conf.d
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

mysql-confd/default_authentication.cnf

[mysqld]
default_authentication_plugin= mysql_native_password

config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: db

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test

公式リファレンスからの変更点やハマった点に関する備忘録

Dockerfile

項目 変更前 変更後
Rubyのバージョン 2.5 2.5.3
apt-getでインストールするパッケージ libpq-dev mysql-client

Gemfile

項目 変更前 変更後
Ruby on Railsのバージョン 5.2.0 5.2.1.1

docker-compose.yml

項目 変更前 変更後
データベースのイメージ postgres mysql
volumes .tmp/db:var/lib/postgresql/data ./tmp/db:/var/lib/mysql
volumes - ./mysql-confd:/etc/mysql/conf.d

補足

  • データベースを永続化するため,明示的にマウントするボリュームを指定
  • MySQL 8.0.xを使用するときに,後述するmysql認証に関するエラーが発生
    認証設定の変更とマウントするボリュームを指定5

rails newを実行

項目 変更前 変更後
--databaseオプション postgres mysql
--skip-bundle -- 追加

ハマった点

  • 現象:以下のエラーが発生
Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection
  • 対策:Dockerをrestart6

docker-compose buildを実行

ハマった点

  • 現象:以下のエラーが発生
Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
  • 対策:docker-compose.ymlの補足の項目を参照されたし

データベース接続

項目 変更前 変更後
adapter postgresql mysql2
encoding unicode utf8

予定(順不同)

  • 今回の設定ファイルをGitHubにアップロード
  • Railsチュートリアルを実践
  • AtCoderに関するWebアプリを作成
  • Dockerの学習
  • RubyRailsなどがバージョンアップした場合への対応方法を調べる


  1. Docker Composeとは,Dockerにおいて複数のコンテナ(ホストOS上に作られる論理的な区画)をまとめて管理するためのツール.筆者のざっくりした認識では,設定ファイルを用意すればWebアプリケーションの本番環境が比較的容易に構築・再現できるものと思っています.

  2. 阿佐志保著,山田祥寛監修:プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化,294p.,翔泳社,2015.11. 注:第2版が出版されており,大幅に加筆されている模様

  3. https://docs.docker.com/compose/rails/

  4. http://roronya.hatenablog.com/entry/2018/04/30/200909

  5. https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html https://qiita.com/yensaki/items/9e453b7320ca2d0461c7

  6. https://github.com/docker/for-win/issues/611

はじめまして!

あなたは誰?

人生初の記事を投稿しました。

hiro_katoです。
よろしくお願いします。

さまざまな縁があって、30歳になった今年から競技プログラミング(略称して競プロと呼ばれることが多い)を始めました。

プログラミング歴は競技プログラミングに参加した時期とほぼ同じです。

日本語で出題される国内最大級のコンテスト(アルゴリズム部門)であるAtCoder Beginner Contestに20回以上参加し、本番中にC問題が解ける回も出てきたというレベルです。

過去問やコンテスト中に問題を解けたときの喜びが大きなモチベーションとなっています。

なぜ記事を投稿しようと思った?

自分にとって難しい問題(AtCoder Beginner ContestのC問題、D問題など)に出会ったときは、 こちらの情報を参考にしています。

  • 公式の解説放送 1や解説pdf 例えば 2
  • コンテスト上位陣の解説ブログ 例えば 3 , 4
  • コンテスト参加者の提出コード

敢えて記事を書き始めたのは、以下の理由があります

  • 複数の解説を参照できたことで、いくつもの疑問が解消された

    • ギブ・アンド・テイクのテイクの部分で少しでも貢献できるようになりたい
  • 思考のジャンプの幅が狭い筆者だからこそ気がつけることがあるかもしれない
    AtCoderに参加されている皆様は天才型が多い印象なので、需要は少ないかも…)

    • AtCoderのレート(茶色)から見た考察や実装のつまづきポイントが、もしかしたら誰かにとって役に立つかもしれないという淡い期待を込めて
  • 定期的にアウトプットをしていくことで、知識の定着や分かりやすい文章の作成能力の向上などを図りたい

参考

記事を執筆された皆さまへ: 掲載不可の場合はお手数をお掛けしますが、@k_hiro1818までご一報ください。