给Rails镜像瘦身

Database and Ruby, Python, History


一直以来,Rails的docker镜像都很庞大。单纯Ruby的官方镜像都800多MB,而alpine版本的Ruby就小了很多,才50多MB。基于这个版本build的Rails镜像将会小很多,不过还是没有Golang build出来的可执行文件小。

REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
ruby                             2.5.7               1de9aa172c47        4 months ago        843MB
ruby                             2.5.7-alpine        07f6f1f7a655        4 months ago        52.8MB

首先,替换Alpine的源,国内就从下面随便选一个源。

阿里源

sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

科大源

sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

清华源

sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories

做个对比,这个是原始的Dockerfile

FROM ruby:2.5.7

RUN apt-get update -qq
RUN apt-get install -y build-essential nodejs net-tools freetds-bin freetds-dev

ENV APP_HOME /blog
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

ADD Gemfile* $APP_HOME/
RUN bundle install --without test

ADD . $APP_HOME

这个是Alpine版的Dockerfile


FROM ruby:2.5.7-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
RUN apk update && \
    apk add --update --no-cache \
    alpine-sdk nodejs net-tools freetds freetds-dev

ENV APP_HOME /blog
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

ADD Gemfile* $APP_HOME/
RUN bundle install --without test

ADD . $APP_HOME

就像.gitignore文件一样,创建一个.dockerignore,这样可以避免把不必要的文件复制到镜像中。

.vscode
log
test
config/deploy
public/packs
public/packs-test
node_modules
coverage/
vendor/
tmp

最后,来个对比吧。体积减少了将近650MB, 约54%。

REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
blog                             alpine              9d87682d1754        2 hours ago         559MB
blog                             latest              1fee71006bf7        6 hours ago         1.18GB
ruby                             2.5.7               1de9aa172c47        4 months ago        843MB
ruby                             2.5.7-alpine        07f6f1f7a655        4 months ago        52.8MB

新建的镜像对比原始的alpine镜像,多出来的部分就是安装的基本包,以及Rails依赖的gem包。

/usr/local # du -h -d 1
40.7M ./lib
164.0K  ./bin
52.0K ./share
279.1M  ./bundle
328.0K  ./include
8.0K  ./etc
320.3M  .