一直以来,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 .