<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yayugu</title>
    <description>The latest articles on DEV Community by yayugu (@yayugu).</description>
    <link>https://dev.to/yayugu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F331158%2Fdd2e517f-3fa3-46f9-abed-278bd6421634.png</url>
      <title>DEV Community: yayugu</title>
      <link>https://dev.to/yayugu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yayugu"/>
    <language>en</language>
    <item>
      <title>Quick tips for the faster container image building on CircleCI</title>
      <dc:creator>yayugu</dc:creator>
      <pubDate>Thu, 06 Feb 2020 09:06:00 +0000</pubDate>
      <link>https://dev.to/yayugu/quick-tips-for-the-faster-container-image-building-on-circleci-3j2j</link>
      <guid>https://dev.to/yayugu/quick-tips-for-the-faster-container-image-building-on-circleci-3j2j</guid>
      <description>&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;For modern, compact images, &lt;code&gt;docker build&lt;/code&gt; on Circle CI is not slow. However, for some reason, you may need to build a relatively large image, which takes from 5 to 10 minutes. In my case, I worked on to containerize a monolithic PHP service. I am going to explain how to boost the building time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Precondition
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I won't explain the best practices for creating images with dockers in general here. Of course, those are important, so please do it first.&lt;/li&gt;
&lt;li&gt;This article contains a bit of bad know-how. It's up to you whether using or not.&lt;/li&gt;
&lt;li&gt;If you build a Jenkins server by yourself, everything is properly cached and faster. But I didn't want to do that, so I used Circle CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Use Machine Executor
&lt;/h3&gt;

&lt;p&gt;Let's start by using Machine Executor. Container Executor puts the Docker Daemon on a separate machine. &lt;code&gt;COPY&lt;/code&gt;ing the whole repository tends to be slow. Also, you won't be able to do some hacks, such as mounting a local directory (see below).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.1&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;machine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build a container&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;docker login .......&lt;/span&gt;
            &lt;span class="s"&gt;docker build --progress plain -t $IMAGE_NAME .&lt;/span&gt;
            &lt;span class="s"&gt;docker push $IMAGE_NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Use BuildKit
&lt;/h3&gt;

&lt;p&gt;BuildKit is a new system for Docker with a lot of optimizations. The default docker version of Machine Executor is out of date, so you must specify the latest image to use BuildKit. It also needs to specify the environment variable (&lt;code&gt;DOCKER_BUILDKIT=1&lt;/code&gt;) at execution time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.1&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;machine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-1604:201903-01&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build a container&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;docker login .......&lt;/span&gt;
            &lt;span class="s"&gt;DOCKER_BUILDKIT=1 docker build --progress plain -t $IMAGE_NAME .&lt;/span&gt;
            &lt;span class="s"&gt;docker push $IMAGE_NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Use Docker Layer Caching
&lt;/h3&gt;

&lt;p&gt;Docker Layer Caching (DLC) persists the directories for the caching and mounts them when the Executor runs. DLC saves a lot of time because downloading can be omitted when pulling the base image (specified in the FROM of the Dockerfile) is large. However, the mounting process takes 5 to 10 seconds when the Executor is started, So when the base image is small, it is faster not to use DLC.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.1&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;machine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-1604:201903-01&lt;/span&gt;
      &lt;span class="na"&gt;docker_layer_caching&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build a container&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;docker login .......&lt;/span&gt;
            &lt;span class="s"&gt;DOCKER_BUILDKIT=1 docker build --progress plain -t $IMAGE_NAME .&lt;/span&gt;
            &lt;span class="s"&gt;docker push $IMAGE_NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Do vendoring on the same job/executor
&lt;/h3&gt;

&lt;p&gt;Vendoring means something like &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;bundle install&lt;/code&gt;, or &lt;code&gt;composer install&lt;/code&gt;. There are several ways to do this on CircleCI (But each one has its drawbacks.):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute as an upstream job in Workflow and pass-through by Workspace or Cache

&lt;ul&gt;
&lt;li&gt;Executors start for each Job, and each takes up to 20 to 30 seconds.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Do in the Dockerfile

&lt;ul&gt;
&lt;li&gt;On CircleCI, Docker's native caching mechanism is difficult to use.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, mounting the local directory to the docker, run vendoring, and cache the result by CircleCI. This strategy is effective.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.1&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;machine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-1604:201903-01&lt;/span&gt;
      &lt;span class="na"&gt;docker_layer_caching&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;checkout&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;restore_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;vendoring-{{ checksum "composer.lock" }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Vendoring&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;docker login .......&lt;/span&gt;
            &lt;span class="s"&gt;docker run --rm -v /home/circleci/repo:/home/circleci/repo \&lt;/span&gt;
                &lt;span class="s"&gt;${BASE_IMAGE} \&lt;/span&gt;
                &lt;span class="s"&gt;bash -c \&lt;/span&gt;
                &lt;span class="s"&gt;"cd /home/circleci/repo &amp;amp;&amp;amp; \&lt;/span&gt;
                &lt;span class="s"&gt;php composer.phar config --global github-oauth.github.com ${GITHUB_TOKEN} &amp;amp;&amp;amp; \&lt;/span&gt;
                &lt;span class="s"&gt;php composer.phar install --prefer-dist --ignore-platform-reqs --no-scripts --no-dev"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;save_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vendoring-{{ checksum "composer.lock" }}&lt;/span&gt;
          &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;vendor&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build a container&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;DOCKER_BUILDKIT=1 docker build --progress plain -t $IMAGE_NAME .&lt;/span&gt;
            &lt;span class="s"&gt;docker push $IMAGE_NAME&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's fast. But if you look at the code, you'll see that this lost the readability. It is also possible to run multiple processes in parallel, but I don't recommend it. It is too complicated.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Using shallow-checkout
&lt;/h3&gt;

&lt;p&gt;This technique has not related to docker, but another way to boost the Job is to speed up git checkout. The Circle CI standard checkout clones the entire git repository. The time can be reduced by shallow checking out. It only pulls the state of the current commit. For some reason, Machine Executors tend to have a slower git checkout than Container Executors, so this technique is more useful for Machine Executor.&lt;/p&gt;

&lt;p&gt;(the command is written directly in the .circleci.yml, but using Orb may be more maintainable if you can use the Orb feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.1&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build-image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;machine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-1604:201903-01&lt;/span&gt;
      &lt;span class="na"&gt;docker_layer_caching&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;shallow-checkout&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;restore_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;vendoring-{{ checksum "composer.lock" }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Vendoring&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;docker login .......&lt;/span&gt;
            &lt;span class="s"&gt;docker run --rm -v /home/circleci/repo:/home/circleci/repo \&lt;/span&gt;
                &lt;span class="s"&gt;${BASE_IMAGE} \&lt;/span&gt;
                &lt;span class="s"&gt;bash -c \&lt;/span&gt;
                &lt;span class="s"&gt;"cd /home/circleci/repo &amp;amp;&amp;amp; \&lt;/span&gt;
                &lt;span class="s"&gt;php composer.phar config --global github-oauth.github.com ${GITHUB_TOKEN} &amp;amp;&amp;amp; \&lt;/span&gt;
                &lt;span class="s"&gt;php composer.phar install --prefer-dist --ignore-platform-reqs --no-scripts --no-dev"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;save_cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vendoring-{{ checksum "composer.lock" }}&lt;/span&gt;
          &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;vendor&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build a container&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;DOCKER_BUILDKIT=1 docker build --progress plain -t $IMAGE_NAME .&lt;/span&gt;
            &lt;span class="s"&gt;docker push $IMAGE_NAME&lt;/span&gt;
&lt;span class="na"&gt;commands&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;shallow-checkout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;from:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://circleci.com/orbs/registry/orb/datacamp/shallow-checkout"&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Shallow checkout&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;set -e&lt;/span&gt;

            &lt;span class="s"&gt;# Workaround old docker images with incorrect $HOME&lt;/span&gt;
            &lt;span class="s"&gt;# check https://github.com/docker/docker/issues/2968 for details&lt;/span&gt;
            &lt;span class="s"&gt;if [ "${HOME}" = "/" ]&lt;/span&gt;
            &lt;span class="s"&gt;then&lt;/span&gt;
              &lt;span class="s"&gt;export HOME=$(getent passwd $(id -un) | cut -d: -f6)&lt;/span&gt;
            &lt;span class="s"&gt;fi&lt;/span&gt;

            &lt;span class="s"&gt;mkdir -p ~/.ssh&lt;/span&gt;
            &lt;span class="s"&gt;# Please fill the value from your execution log of `checkout`&lt;/span&gt;
            &lt;span class="s"&gt;echo 'github.com ssh-rsa XXXXXXXXXXXXXXXX &lt;/span&gt;
            &lt;span class="s"&gt;' &amp;gt;&amp;gt; ~/.ssh/known_hosts&lt;/span&gt;

            &lt;span class="s"&gt;(umask 077; touch ~/.ssh/id_rsa)&lt;/span&gt;
            &lt;span class="s"&gt;chmod 0600 ~/.ssh/id_rsa&lt;/span&gt;
            &lt;span class="s"&gt;(echo $CHECKOUT_KEY &amp;gt; ~/.ssh/id_rsa)&lt;/span&gt;

            &lt;span class="s"&gt;# use git+ssh instead of https&lt;/span&gt;
            &lt;span class="s"&gt;git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true&lt;/span&gt;
            &lt;span class="s"&gt;git config --global gc.auto 0 || true&lt;/span&gt;

            &lt;span class="s"&gt;mkdir -p $CIRCLE_WORKING_DIRECTORY&lt;/span&gt;
            &lt;span class="s"&gt;cd $CIRCLE_WORKING_DIRECTORY&lt;/span&gt;

            &lt;span class="s"&gt;if [ -n "$CIRCLE_TAG" ]&lt;/span&gt;
            &lt;span class="s"&gt;then&lt;/span&gt;
              &lt;span class="s"&gt;git clone --depth=1 -b "$CIRCLE_TAG" "$CIRCLE_REPOSITORY_URL" .&lt;/span&gt;
            &lt;span class="s"&gt;else&lt;/span&gt;
              &lt;span class="s"&gt;git clone --depth=1 -b "$CIRCLE_BRANCH" "$CIRCLE_REPOSITORY_URL" .&lt;/span&gt;
            &lt;span class="s"&gt;fi&lt;/span&gt;
            &lt;span class="s"&gt;git fetch --depth=1 --force origin "$CIRCLE_SHA1" || echo "Git version &amp;gt;2.5 not installed"&lt;/span&gt;

            &lt;span class="s"&gt;if [ -n "$CIRCLE_TAG" ]&lt;/span&gt;
            &lt;span class="s"&gt;then&lt;/span&gt;
              &lt;span class="s"&gt;git reset --hard "$CIRCLE_SHA1"&lt;/span&gt;
              &lt;span class="s"&gt;git checkout -q "$CIRCLE_TAG"&lt;/span&gt;
            &lt;span class="s"&gt;elif [ -n "$CIRCLE_BRANCH" ]&lt;/span&gt;
            &lt;span class="s"&gt;then&lt;/span&gt;
              &lt;span class="s"&gt;git reset --hard "$CIRCLE_SHA1"&lt;/span&gt;
              &lt;span class="s"&gt;git checkout -q -B "$CIRCLE_BRANCH"&lt;/span&gt;
            &lt;span class="s"&gt;fi&lt;/span&gt;

            &lt;span class="s"&gt;git reset --hard "$CIRCLE_SHA1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;In my environment, when a commit is pushed to a Pull Request, it is automatically deployed to the Dev environment on the Kubernetes, Then the building time is critical. With these speedups, the building image only takes around 90 seconds compared to the 5+ minutes for a 500MB image. So far, so good to us. But if you optimize too much, you will lose readability and maintainability, keeping a good balance!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>circleci</category>
      <category>container</category>
    </item>
  </channel>
</rss>
