Open6

既存のrailsアプリのDocker開発環境構築メモ(Rails6, MariaDB)

cryZcryZ

準備
以下のファイルをアプリのルートディレクトリ直下に配置

  • Dockerfile
  • docker-compose.yml
  • entrypoint.sh
  • development.env(環境変数設定のために用意)

新規にアプリを作成する場合

ディレクトリを作成して、上記の3つに加えて
Gemfile, Gemfile.lockも用意

Gemfile
source 'https://rubygems.org'
gem 'rails', '6.0.3'

Gemfile.lockは空でOK

cryZcryZ

Dockerfile, entrypoint.sh

entrypoint.sh
#!/bin/bash
set -e

rm -f /myapp/tmp/pids/server.pid

exec "$@"
Dockerfile
FROM ruby:2.7.1
RUN apt-get update -qq \
    && apt-get install -y nodejs yarn \
# railsアプリを配置するディレクトリを作成して作業ディレクトリとする
    && mkdir /アプリのディレクトリ名
WORKDIR /アプリのディレクトリ名
# ホストのGemfile達をコンテナ内にコピー
COPY Gemfile /アプリのディレクトリ名/Gemfile
COPY Gemfile.lock /アプリのディレクトリ名/Gemfile.lock
RUN gem install bundler
RUN bundle install
COPY . /アプリのディレクトリ名

# entrypoint.shをコピーし、実行権限を与える
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# -bはバインドを意味する
CMD ["rails", "server", "-b", "0.0.0.0"]
cryZcryZ

docker-compose.yml

docker-compose.ymlと同じディレクトリにある.envファイルは自動的に読み込まれるらしい。
またenv_fileというオプションを用いる方法もあり、これだとファイル名を指定して.envファイルを参照させることができる(複数も可能)
後者のほうで実装した。

development.envという環境変数用のファイルを作成

development.env
MYSQL_ROOT_PASSWORD=password
MYSQL_USER=dbmaster
MYSQL_PASSWORD=railsdbpassword

env_fileオプションで先程の.envを読み込ませる

docker-compose.yml
version: "3.7"
services:
  db:
    image: mariadb:10.5
    volumes:
      - dbvolume:/var/lib/mysql/data
    env_file: development.env
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/アプリのディレクトリ名
      - gem_data:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
    env_file: development.env
# 以下二行はdocker環境でpry-byebugを使用するために必要。
    stdin_open: true
    tty: true

volumes:
  dbvolume:
  gem_data:

注意点としては、dbだけでなくweb側にもenv_fileで読み込ませる必要があるということ。
なぜならrails側のdatabase.ymlでもその環境変数を使用するから

database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV["MYSQL_ROOT_PASSWORD"] %>
  host: db

参考

https://docs.docker.jp/compose/environment-variables.html
https://docs.docker.jp/compose/compose-file.html#env-file
https://blog.cloud-acct.com/posts/u-env-docker-compose/
https://nishinatoshiharu.com/dockercompose-envfile/
https://qiita.com/koshigoe/items/52749db8836b4e3fbfc4
https://qiita.com/ysKey2/items/346c429ac8dfa0aed892
https://nishinatoshiharu.com/datavolume-for-gem/
https://teratail.com/questions/214485

cryZcryZ

yarnのバージョンが古いってさ

web_1  | ========================================
web_1  |   Your Yarn packages are out of date!
web_1  |   Please run `yarn install --check-files` to update.
web_1  | ========================================
web_1  | 
web_1  | 
web_1  | To disable this check, please change `check_yarn_integrity`
web_1  | to `false` in your webpacker config file (config/webpacker.yml).

このエラーによってdocker compose upできない。つらみ

そもそもDockerfileでは新規にインストールしてるのに古いってどういうことだ?
ローカルの環境のyarnが古いからとか?等いろいろ考えていたが、
下の2行に書いてある方法で解消している記事が多かったので、こちらでやってみた。
書いてあるとおりにcheck_yarn_integrityをfalseにしただけである。

最新バージョンがあったらエラーを出して教えてくれるのがこのcheck_yarn_integrityの模様。
falseにすることで無効化できるということみたい。
もっと深堀りしたいところだけど、とりあえず既存のアプリケーションの開発環境をdockerで構築することができたので、良かった。。。

https://qiita.com/busitora2/items/9ce2877d2ead84a44fda

cryZcryZ

イメージのbusterとかnodeとかbrowserって何

CircleCIでのCI構築でイメージ選択時に思ったこと。
ちゃんと公式にあった。

-node: 多言語対応の Node.js が含まれます。
-browsers: Chrome、Firefox、OpenJDK v11、および GeckoDriver が含まれます。
-node-browsers: -node バリアントと -browsers バリアントの組み合わせです。

構築の際使ったDockerfileではrubyのみ指定したイメージにしたから、その後RUNコマンドでnodeやyarnのインストールを宣言していた。また別でメモを作る予定だがrspec実行のためにdocker-compose.yml内でchromedriverのイメージを追加したりした。

CircleCIでは仮想コンテナを作成してそこでテストを実行する
-node-browsersタグのついたイメージを使えば効率いいってことかな