アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

個人開発アプリをDockerでコンテナ化してみた

新米Webエンジニアのhiroさんです。

個人開発アプリをDockerでコンテナ化したので記事にします。
GitHub - env-gp/motoprize

Dockerfile、docker-compose.ymlのたたき台を作成

※ 学習も兼ねているため、コメントを多用しています

Dockerfile

#ベースイメージを指定。必須項目
FROM ruby:2.5.1

# RUN命令は1命令ごとに1イメージを作成する
# イメージをまとめるためにRUN命令はできるだけまとめる
# postgresql-clientのインストール
# パッケージインデックスファイルの削除
RUN apt-get update -qq \
  && apt-get install -y --no-install-recommends \
      postgresql-client \
  && rm -rf /var/lib/apt/lists/*

# build-essential、nodejsのインストール
RUN apt-get update -qq && apt-get install -y \
    build-essential \
    nodejs \
 && rm -rf /var/lib/apt/lists/*

# Bundlerのインストール
RUN gem install bundler

# イメージ内にappディレクトリを作成して作業ディレクトリにする
WORKDIR /app

# Gemfile, Gemfile.lockをイメージのappディレクトリにコピーしてbundle install
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

# ホスト上のカレントディレクトリファイルをイメージのカレントディレクトリにコピー
ADD . .

docker-compose.yml

#docker-composeのバージョン
version: '3'
services:
  db:
    image: postgres
    ports:
      - '5432:5432' # ホストからゲストへポートフォワード
    volumes:
      - postgresql-data:/var/lib/postgresql/data # 永続化のためホストにボリュームを保存
  rails:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからrailsを実行
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/app # コード変更したらDocker側も即反映
volumes:
  postgresql-data:
    driver: local

database.yml

docker-compose.ymlのサービス名を追記

default: &default
  adapter: postgresql
  encoding: unicode
  host: db

You must use Bundler 2 or greater with this lockfile.が発生

docker-compose buildを行うと以下のエラーとなった。 You must use Bundler 2 or greater with this lockfile.

ja.stackoverflow.com

2.5.1から2.6.2にバージョンアップして解決

rubyのバグのようなので対応済みの2.6.2に上げる。

  • DockerfileのベースイメージをFROM ruby:2.6.2に変更
  • Gemfileのrubyバージョンをruby '2.6.2'に変更

以下のコマンドを実行

docker-compose build                                    # イメージを作成
docker-compose up                                       # イメージからコンテナを起動
docker exec -it motoprize_rails_1 /bin/bash             # コンテナにログイン

# コンテナ内でcreate、migrate、seedを実行
bin/rails db:create                                             
bin/rails db:migrate
bin/rails db:seed

Autoprefixer doesn’t support Node v4.8.2. Update itエラーが発生

http://localhost:3000/にアクセスしたところ、以下のエラーとなった。

f:id:envgp:20200105120327p:plain

qiita.com

Node.js v10.xをインストールして解決

  • nodejsが古いようなのでNode.js v10.xをインストールする。Dockerfileを以下を追記
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \
  && apt-get install -y nodejs

再度アクセスするとエラーは解消され、ブラウザ上での動作確認は問題ありませんでした。 が、SystemSpecが全滅で大量にエラーが出ました。 ここからどハマりしてしまい、タイムアップとなってしまったのでまたの機会にさせてください。。

所感

今回、Dockerを網羅的に学んだわけではないですが、まずは手を動かしてみることが大事なのでトライしてみました。 これで実践レベルのDockerfile、docker-compose.ymlも多少は読めるようになりました。 まだまだ改良の余地があるので改善していこうと思います。
今後は下記のタスクを実行していきます。

  • コンテナ上でSystemSpecが実行できるようにする
  • どこかのレンタルサーバーでproduction環境をコンテナで構築する。nginxイメージも追加する。

Dockerはとても便利ですが、個人開発の場合はあまり恩恵ないですね〜