docker - 使用多个FROM语句缩短Dockerfile的构建时间

标签 docker dockerfile google-cloud-build

是否可以使我的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镜像并将其与其注册表一起存储。

最佳答案

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构建都会识别这种情况,并使构建缓存中遵循该指令的任何层失效。

现在,只要您在同一台计算机上运行后续构建,我前面说的所有内容都是有效的。

由于您使用的是Google Cloud Build,因此每次都会在一个干净的新环境中运行每个版本,因此,缓存中将没有任何docker中间层...除非您将Google Cloud Build配置为保存和还原缓存。

从Google Cloud Build Best practices for speeding up builds文档中,您将找到有关如何启用Kaniko缓存的说明,该缓存将用于保存这些docker build中间层。

关于docker - 使用多个FROM语句缩短Dockerfile的构建时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55434689/

相关文章:

.net - 问:如何配置cloudbuild.yaml以运行测试?

logging - 向 Google Cloud Build 日志输出添加时间戳

docker - Docker In Docker IN中的Docker Compose(网络问题)

docker - 如何在docker容器中正确使用系统用户

Angular 8 docker容器即使已安装也找不到模块

docker - Docker提交而不运行

linux - Docker : Run an automatically determined amount of containers

github - Google Cloud 为 GitHub Repo 构建触发器说 "No tag matches"总是

ruby-on-rails - 每次我运行docker-compose运行web时,都使用Docker多个容器

docker - 使用 docker-compose.yml 自动删除容器