避免每次重新构建整个 Docker 容器? 提高速度

9
将需要重建容器的Rails应用程序Docker化需要很长时间。 我尝试将ADD命令放在最后,但似乎不行了。 有什么建议可以提高Docker容器的重建速度吗? 或者有没有一般性的建议来改进Docker文件,因为每次重建都需要很长时间。 此外,有没有聪明的方法来检查例如目录是否已经存在,而不会抛出错误并且无法完成构建?
FROM ruby:2.2.0
EXPOSE 80
EXPOSE 22
ENV RAILS_ENV production

RUN apt-get update -qq && apt-get install -y build-essential

# --------------------------------------
# GEM PRE-REQ
# --------------------------------------
#RUN apt-get install -y libpq-dev
#RUN apt-get install -y libxml2-dev libxslt1-dev #nokigiri
#RUN apt-get install -y libqt4-webkit libqt4-dev xvfb
RUN cd /tmp && git clone https://github.com/maxmind/geoipupdate && cd geoipupdate && ./bootstrap

# --------------------------------------
# HOME FOLDER
# --------------------------------------
WORKDIR                             /srv/my

ADD . /srv/my
ADD ./Gemfile                       /srv/my/Gemfile
ADD ./Gemfile.lock                  /srv/my/Gemfile.lock

#RUN mkdir                           /srv/my
RUN bundle install --without development test
#RUN bundle install foreman


RUN bundle exec rake assets:precompile --trace


# --------------------------------------
# UNICORN AND NGINX
# --------------------------------------

ADD ./config/_server/unicorn_my /etc/init.d/unicorn_my
RUN chmod 755 /etc/init.d/unicorn_my
RUN update-rc.d unicorn_my defaults
ADD ./config/_server/nginx.conf /etc/nginx/sites-available/default

RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
#RUN chown -R www-data:www-data /var/lib/nginx ??
ADD ./config/_server/nginx.conf /etc/nginx/my.conf
ADD ./config/_server/my.conf /etc/nginx/sites-enabled/my.conf
ADD ./config/_server/unicorn.rb /srv/my/config/unicorn.rb
ADD ./config/_server/Procfile /srv/my/Procfile

#RUN service unicorn_my start
#RUN foreman start -f ./Procfile
1个回答

13

您可以通过以下方法提高构建速度:

  • 尽早安装所有必需品。
  • 将所有apt-get/yum合并为单个命令,之后清理apt/yum缓存。这可以减小镜像大小。

示例:

RUN \
  apt-get -y update && \
  apt-get -y install curl build-essential nginx && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/*
  • 尽可能将ADD/COPY指令放在最后,因为它会使Docker镜像缓存失效。
  • 避免在ADD/COPY之后添加长时间运行的任务(例如:apt-get、下载大文件等),特别是对经常更改的文件或目录。

Docker为每个命令拍摄一个“快照”。因此,当您从相同状态(没有Dockerfile/文件/目录更改)构建新镜像时,它应该很快。

注释/取消Dockerfile以减少apt-get install的时间可能不起作用,因为它会使您的Docker缓存失效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接