ゆるふわ技術日誌

エンジニア見習いの悪戦苦闘日記

Dockerfileに苦戦した #267

Dockerfile

研究室のサイトを作る関係で、JekyllをビルドしてWebサーバー立てるDockerfileを書く必要が出てきたので、そんなことをした。

私が最初に書いたDockerfileはこちら。

FROM ruby:2.5.0

ENV PORT 8000

ADD . /jekyll/
WORKDIR /jekyll

RUN bundle install --path vendor/bundle
RUN bundle exec jekyll build

CMD ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./_site", :Port => ENV["PORT"]).start'

こんな感じ。

とりあえずディレクトリ以下をコンテナの/jekyllに持って行ってbundle installしてビルドする。吐き出されたディレクトリ以下をWEBrickを使って公開する…みたいな?(jekyll serveでいいような気がしてきたけどそこは本題ではない)

これでええやろ〜〜と思っていたのですが、「これ毎回bundle install走るからめっちゃビルド時間かかるんですよwwww」とか研究室で言ってたらそうじゃねぇwと言われてしまった。

書き直したDockerfileはこれ

FROM ruby:2.5.0

ENV PORT 8000

WORKDIR /jekyll

ADD ./Gemfile .
ADD ./Gemfile.lock .

RUN bundle install --path vendor/bundle

ADD . .

RUN bundle exec jekyll build

CMD ruby -rwebrick -e 'WEBrick::HTTPServer.new(:DocumentRoot => "./_site", :Port => ENV["PORT"]).start'

先にGemfileだけをコンテナに持って行ってbundle installして、その後に他のファイルも持って行ってビルドをするという感じ。

こうするとGemfileに変更を加えない限りはbundle installの行まではキャッシュが効くので一瞬で終わる。

いやお前これ当たり前やん…!と言われてしまえばそれまでなのですが、僕はこれを知らなかった。悔しさある。

おかげで一瞬でビルドが終わるようになりました。

んでまぁこんなスライドが有名だよと教えてもらった。

これを読んで、RUN&&\で繋げまくっているDockerfileとかがやたら存在する理由がわかった。

何気ないことでも普通に学びがあるので研究室は良いところ。

雑談

まぁそんなこんなでDockerfile書いたり、ちまちまこまこました作業をしていたら、あっという間にこんな時間。

明日は遅いし、今日もElmをやろうかな。