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をやろうかな。