是否可以使我的docker构建速度更快。
我已经看到Dockerfile包含多个FROM语句,这与我的Dockerfile有意义吗?
FROM ruby:2.5-alpine
RUN apk update && apk --update add \
build-base \
nodejs \
postgresql-dev \
tzdata \
imagemagick \
ruby-dev \
libxml2-dev \
libxslt-dev \
pcre-dev \
libffi-dev
# yarn
ENV PATH=/root/.yarn/bin:$PATH
RUN apk add --virtual build-yarn curl && \
touch ~/.bashrc && \
curl -o- -L https://yarnpkg.com/install.sh | sh && \
apk del build-yarn
# app
RUN mkdir /app
WORKDIR /app
COPY Gemfile ./
RUN gem install bundler -v 2.0.1
RUN gem uninstall bundler --version '<2.0.0'
RUN gem install nokogiri -v '1.10.1' --source 'https://rubygems.org/'
RUN bundle install --binstubs
我正在使用Google Cloud构建和注册表,因此我可以存储中间docker映像并将其与注册表一起存储。
答案 0 :(得分:1)
Docker multi stage builds可以帮助减小最终映像的大小,但不会减少构建时间。
减少构建时间的原因是了解Docker构建缓存的工作原理。阅读Docker Leverage build cache文档中的Best practices for writing Dockerfiles。
我不熟悉Ruby,但是在我看来Gemfile
仅对bundle install
命令有用,而对gem install
命令却不起作用。如果是这种情况,最好移动COPY Gemfile ./
行,使其显示在RUN bundle install --binstubs
之前。原因是每次您的Gemfile更改时, docker build 都会识别这种情况,并使来自构建缓存的该指令之后的任何层失效。
现在,只要您在同一台计算机上运行后续构建,我前面说的所有内容都是有效的。
由于您使用的是Google Cloud Build,因此每次都会在新的干净环境中运行每个构建,因此,缓存中将没有任何docker中间层...除非您配置Google Cloud Build来保存和还原您的缓存。
从Google Cloud Build Best practices for speeding up builds文档中,您将找到有关如何启用Kaniko缓存的说明,该缓存将用于保存这些docker build中间层。