目的
何かあるとすぐにローカルのイメージ、コンテナ、ボリュームをまっさらにする癖があるが
ローカルでのDockerfileからのイメージのビルドが遅すぎる
高速化して開発効率をあげたい
ゴール
軽量なイメージを作成し、docker hubにあげて
それを参照するようにしたい
実践
軽量なイメージを作る
参考記事
- RailsのDockerイメージを一番小さくする方法
scratchは面倒くさそうなので一旦alpineでやります
ちなみに
https://imagelayers.io/
は死んでるので
https://microbadger.com
を使ってイメージの中身を解析できる
完成したDockerfile
FROM ruby:2.6.1-alpine
WORKDIR /usr/src/app
ENV TZ=Asia/Tokyo
COPY Gemfile .
COPY Gemfile.lock .
COPY package.json .
COPY yarn.lock .
RUN apk update && \
apk add --no-cache yarn tzdata libxml2-dev curl-dev make gcc libc-dev g++ mariadb-dev imagemagick6-dev && \
bundle install && \
yarn install && \
rm -rf /usr/local/bundle/cache/* /usr/local/share/.cache/* /var/cache/* /tmp/* && \
apk del libxml2-dev curl-dev make gcc libc-dev g++
解説
- apkについて
-
yarn
はwebpacker使うので -
tzdata
はないとrails s
をした時にtzinfo-data
周りでコケる -
libxml2-dev curl-dev make gcc libc-dev g++
はnative extensionで必要(nokogiriとか) -
mariadb-dev
はmysql使うために必要 -
imagemagick6-dev
はrmagick使うために必要 - なんかよくわからんけど6じゃないとダメらしい
-
- RUNについて
- 1個にまとめて
&&
で繋ぐと少し軽くなるらしい
- 1個にまとめて
-
/usr/local/bundle/cache /usr/local/share/.cache
について- 参考記事にも書いてある通りキャッシュが意外と容量食ってた
docker hubへのイメージのpush
参考資料
- DockerImageをDockerHubに登録の仕方
こちらの記事読めばそのままいけます
ハマりどころ
最後にrails s
しようとしたらtzinfo-data
がないよって言われたり(tzdata追加で解決)
bundle install
でいろいろパッケージが足りないよって言われたり
手探りでパッケージ入れてく必要があったので大変でした
最終的に
最初に適当に作ってたイメージが1.9GB
最終的に1GBを切ったのでだいたい半分ぐらい
雑なメモ書きみたいになってるので運用法含めていつか記事を書き直す