新しくRailsのアプリケーションを作って書いた。データベースはPostgeSQLを使う想定。 GitHub - ikaruga777/taskleaf実際にdockernizeしたものはこちら。(現場Rails本のサンプルアプリケーションを使った)
Quickstart: Compose and Rails | Docker Documentation ココらへんを参考にした。
Dockerfileを作る
FROM ruby:2.6.3 RUN apt-get update -qq \ && apt-get install -y postgresql-client \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* ENV LANG=C.UTF-8 \ TZ=Asia/Tokyo \ APP_HOME=/usr/src/app WORKDIR $APP_HOME COPY Gemfile* $APP_HOME/ RUN bundle install COPY . $APP_HOME/
RUN
命令でDockerfileのImageに対してコマンドを実行する。
RUN apt-get update -qq \ && apt-get install -y postgresql-client \ && apt-get clean
apt-get update
の-qq
オプションはエラー以外を出力しないもの。- postgresqlもDocker Imageで用意するけど、Railsアプリ自体に接続するためのクライアントが入っていないので、
apt-get install -y postgresql-client
でインストール - 最後に apt-get cleanで一時ファイルなどを削除する
ENV
命令は環境変数を設定できる。
今回は文字コード、タイムゾーン、アプリケーションのルートディレクトリを設定した。
WORKDIR
命令はアプリケーションの作業ディレクトリを設定できる。設定したディレクトリが存在しない場合は自動で作成される。
Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント
COPY
命令はローカルファイルをコンテナファイルにコピーする。 ローカルのカレントディレクトリのGemfile*
をコピーしてbundle install
を実行後、残りのディレクトリをごそっとコピーするようにした。Quick guildeでは /myapp
とかルートディレクトリからディレクトリを生やしていたので、とりあえずusr/src/
で作業するようにした。
これでカレントディレクトリのRailsアプリケーションを実行するためのコンテナの作成はOK
docker-compose.ymlを作る
Railsのプロセスが動くコンテナはできたので、docker-composeでその他のコンテナを集めて、実行環境を作っていく。
version: '3' services: db: image: postgres:11.2 environment: POSTGRES_PASSWORD: postgres ports: - '5432:5432' volumes: - postgres-data:/var/lib/postgresql/data app: &app_base build: . command: /bin/sh -c "rm -f ./tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" ports: - '3000:3000' volumes: - .:/usr/src/app environment: RAILS_ENV: development depends_on: - db spring: <<: *app_base command: bin/spring server ports: [] volumes: postgres-data:
postgres
と上で作成した、Appコンテナ、springサーバーを起動するためのサービスを定義する。
db Service
PostgreSQLのコンテナpostgres:11.2
は POSTGRES_PASSWORD
環境変数でデータベースパスワードを設定できる。そのまま、5432番ポートでつながるようにマッピング。
postgres-data
というボリュームをファイルの下の volumes:
で定義しているので、postgresのデータをそのままボリュームに指定する。/var/lib/postgresql/data
がデータを保存するディレクトリだということはDocker Hubのページから確認できる。
app Service
docker-compose build
コマンドでDockerfileの内容でbuildされる。
起動時には bundle exec rails
の前に rm -f ./tmp/pids/server.pid
を実行している。これはdocker-compose kill
を実行したときにファイルが残って、次回起動時にエラーになっちゃうから。
spring Service
docker-compose up
したあとにappコンテナ内でRailsのコマンドを効率的よく実行したいので、spring
をdocker-compose exec
コマンドで呼べるようにしている。
高速に開発できる Docker + Rails開発環境のテンプレートを作った - Qiita ここ眺めて、<<
がdocker-compose.ymlの記法に見当たらないと思ってさまよっていたんだけど、YAMLの記法だった。&foo
でハッシュに名前をつけれて、<<: *foo
でその内容をそのまま展開できる。これで同じコンテナで違うcommand
を持つserviceが作成できる。
database.ymlの設定を変える
config/database.yml
の内容をdockerのpostgresで使えるように設定する。
- host
にはdocker-compose.yml
に記載したサービスdb
を指定する
- user
、password
には postgres
を設定する。
- user
はpostgres
コンテナのデフォルト、password
はdocker-compose.yml
で指定した環境変数POSTGRES_PASSWORD
を設定する。
ここまで書けば、
docker-compose build
docker-compose up
でRailsのアプリケーションがDockerコンテナで実行できる。
改善
読み返すと甘いところもあって
/vendor/bundle
をvolumeに外出しできそう- nodeをインストールするのがだるくて、
mini-racer
をインストールしてたりするけどどっちがいいのか迷ってる - そもそもAPPコンテナの容量が1.2Gとかあるので、削減できそう
などなど改善できそうなので、やっていこうと思う。