既存のrailsアプリのDocker開発環境構築メモ(Rails6, MariaDB)
準備
以下のファイルをアプリのルートディレクトリ直下に配置
- Dockerfile
- docker-compose.yml
- entrypoint.sh
- development.env(環境変数設定のために用意)
新規にアプリを作成する場合
ディレクトリを作成して、上記の3つに加えて
Gemfile, Gemfile.lockも用意
source 'https://rubygems.org'
gem 'rails', '6.0.3'
Gemfile.lockは空でOK
Dockerfile, entrypoint.sh
#!/bin/bash
set -e
rm -f /myapp/tmp/pids/server.pid
exec "$@"
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"]
docker-compose.yml
docker-compose.ymlと同じディレクトリにある.envファイルは自動的に読み込まれるらしい。
またenv_fileというオプションを用いる方法もあり、これだとファイル名を指定して.envファイルを参照させることができる(複数も可能)
後者のほうで実装した。
development.envという環境変数用のファイルを作成
MYSQL_ROOT_PASSWORD=password
MYSQL_USER=dbmaster
MYSQL_PASSWORD=railsdbpassword
env_fileオプションで先程の.envを読み込ませる
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でもその環境変数を使用するから
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: <%= ENV["MYSQL_ROOT_PASSWORD"] %>
host: db
参考
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で構築することができたので、良かった。。。
コンテナ内でvimを使いたい
何もしていないとviも使えない状態
コンテナ内に入ってbashを立ち上げ下記を実行
もしくはDockerfileで最初から下記を入れておくのも良い
apt-get update
apt-get install vim
イメージの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タグのついたイメージを使えば効率いいってことかな