新米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.
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/にアクセスしたところ、以下のエラーとなった。

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はとても便利ですが、個人開発の場合はあまり恩恵ないですね〜