既存のRailsアプリケーションをDocker化する道のりです
rails appをひとまずビルドしてみる
まずはこちらのチュートリアルに習い、Dockerファイルを作成、起動ができるかを試してみました。
このチュートリアルでも、Railsの起動を取り扱っているので、DockerFileはこちらを真似て作成。
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
apt-get update -qq
(なんの)アップデート可能な一覧を表示
apt-get install (引数)
引数のパッケージをインストールする
-y
インタラクティブ(ユーザーへの問い合わせ)に「yes」と答えます。(文言変える)
https://webkaru.net/linux/apt-get-command/
- build-essential
- libpq-dev
- nodejs
それぞれ必要なやつ
こちらを
docker run -dp 127.0.0.1:3000:3000 getting-started
うまくビルドできた!
local3000にアクセスしてみると、「データベースがない」と怒られますが、
エラーメッセージは出るので起動はしていそう。
compose upしてみる
今度はデータベースも起動するために
またまたこちらのチュートリアルに習って、ymlファイルを作成して、Compose up まで行う
version: '3'
services:
db:
image: postgres
environment:
POSTGRES_HOST_AUTH_METHOD: 'trust'
volumes:
- ./postgres/data:/var/lib/postgresql/data
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
volumes:
postgres_data:
POSTGRES_HOST_AUTH_METHOD: 'trust'
本来はちゃんとパスワードを設定した方がよいとのことです
参考記事
ymlファイルを作成したら、
docker compose-up
初回のみデータベースをCreateしたあと、Migrationする必要があります
別でターミナルを起動して、
docker-compose run web rake db:create
Createしただけだと「Migrateされてない!」と怒られるので、Migrateもする
docker-compose run web rake db:migrate
ローカルホストにアクセス
http://localhost:3000/
できた!
docker-compose down
で停止しないと、
次回の起動時に「server.pidが既にあるよ!」と怒られるので、
そのときはローカルの該当ファイルを削除してみてください。
軽量化してみる
docker images
でImageのサイズが確認できる!
みてみたところ、今回のイメージが1.16GBも使っていたので、軽量化にもチャレンジしてみました
試したこと
1. Dockerファイルを見直す
- RUNが続いていた場合は、
&&
で繋げる -
mkdir
のあとにWORKDIR
してる場合は、WORKDIR
のみにする- ディレクトリが存在しない場合は、自動的に作成してくれます!
- 不要な
ADD
をしていないかみてみる
これらをやってみたところ、
1.25GBに!増えてる!!!
2. ベースイメージを変える
他に軽量化するとしたら、ベースイメージを変えるしかない?と思っていたら、
alpineという軽いベースイメージがあるらしい!ということで、
これでBuildを試してみました
DockerFileの一行目を
FROM ruby:3.2.2-alpine3.18
に変更して、そのままビルドしたところ、
「apt-getなどない」
「build-essentialなどない」
0.911 ERROR: unable to select packages:
0.911 build-essential (no such package):
0.911 required by: world[build-essential]
「tzinfo-dataがない、インストールしろ」
`rescue in create_default_data_source': tzinfo-data is not present.
Please add gem 'tzinfo-data' to your Gemfile and
run bundle install (TZInfo::DataSourceNotFound)
などの文句を言われ、泣きながらDockerファイルを修正した結果、
FROM ruby:3.2.2-alpine3.18
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN apk update && \
apk upgrade && \
apk add --no-cache alpine-sdk libpq-dev nodejs tzdata && \
bundle install
こちらのファイルでBuildして動くようになりました!
apk add
・・・apt-get
の代わり
alpine-sdk
・・・build-essentialの代わりのようです
Imageサイズも469MBに
ただ、実行しているアプリの立ち上げや遷移の動きが若干鈍くなったような気がします。
重くてもいいなら、ベースイメージはそのままの方が良いかなと思いました
軽量化で参考にしたページ
build-essentialがないと言われた時