# Caching Docker image with Docker Hub

**URL:** <https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784>\
**Category:** Tips, Tricks, and Hacks\
**Created:** [January 28, 2016, 7:30am UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784 "2016-01-28T07:30:46Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![kimh](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/kimh/32/19_2.png) [@kimh](https://discuss.circleci.com/u/kimh)\
**Post date:** [January 28, 2016, 7:30am UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/1 "2016-01-28T07:30:46Z")

</div>

I wrote original content here: [https://github.com/kimh/circleci-build-recipies/tree/better-docker-cache](https://github.com/kimh/circleci-build-recipies/tree/better-docker-cache)

The following [circle.yml](https://github.com/kimh/circleci-build-recipies/blob/better-docker-cache/circle.yml) demonstrates how we can use Docker Hub for caching.

```auto
machine:
  services:
    - docker

dependencies:
  pre:
    - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS

  override:
    - docker pull kimh/build-image:latest || true

test:
  override:
    - docker build -t kimh/build-image:latest .
    - docker push kimh/build-image:latest

```

Here is [Dockerfile](https://github.com/kimh/circleci-build-recipies/blob/better-docker-cache/Dockerfile).

```auto
FROM phusion/passenger-ruby21:latest

RUN apt-get update
RUN apt-get install sl

WORKDIR /tmp
ADD Gemfile /tmp/
ADD Gemfile.lock /tmp/
RUN bundle install

```

What we are doing in `circle.yml` is very simple:

- Pull image from Docker Hub that was pushed from previous builds
- Build image from Dockerfile
- Push the image back to Docker Hub for the subsequent builds

In short, we are using Docker Hub as our image cache store.

To see how caching works, you can compare [this](https://circleci.com/gh/kimh/circleci-build-recipies/119) and [this](https://circleci.com/gh/kimh/circleci-build-recipies/120) builds.

In the first build, `docker build` took about 3 mins and `docker push` took 2 mins, but both commands finish immediately in the second build thanks to cache.

---

<div class="post-metadata">

**Author:** ![steevel](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/steevel/32/1576_2.png) [@steevel](https://discuss.circleci.com/u/steevel)\
**Post date:** [February 15, 2016, 12:35pm UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/2 "2016-02-15T12:35:59Z")

</div>

The two recipies you link to are the same. Do you mind sharing the correct ones?

---

<div class="post-metadata">

**Author:** ![kimh](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/kimh/32/19_2.png) [@kimh](https://discuss.circleci.com/u/kimh)\
**Post date:** [February 17, 2016, 1:12am UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/3 "2016-02-17T01:12:16Z")

</div>

@steevel Sorry! I just fixed the link.

---

<div class="post-metadata">

**Author:** ![itajaja](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/itajaja/32/1137_2.png) [@itajaja](https://discuss.circleci.com/u/itajaja)\
**Post date:** [February 18, 2016, 5:31pm UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/4 "2016-02-18T17:31:48Z")

</div>

How are we handling the fact that now you are pushing a `latest` image in your registry? You might use that registry also for CD, how do you make sure you are not going to deploy a potentially broken image? Also, how do you handle the fact that now multiple branches share the same cache? This could lead to invalidating the cache more often at best, or to undeterministic results in your builds at worst

---

<div class="post-metadata">

**Author:** ![agrothberg](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/agrothberg/32/9105_2.png) [@agrothberg](https://discuss.circleci.com/u/agrothberg)\
**Post date:** [February 18, 2016, 5:55pm UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/5 "2016-02-18T17:55:30Z")

</div>

I am guessing that for private builds we would also want to have private Docker repos which cost additional money.

---

<div class="post-metadata">

**Author:** ![agrothberg](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/agrothberg/32/9105_2.png) [@agrothberg](https://discuss.circleci.com/u/agrothberg)\
**Post date:** [February 20, 2016, 7:46pm UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/6 "2016-02-20T19:46:05Z")

</div>

This is how CodeShip handles the problem (using a Docker registry and then tagging per branch): [https://codeship.com/documentation/docker/caching/](https://codeship.com/documentation/docker/caching/)

---

<div class="post-metadata">

**Author:** ![kimh](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/kimh/32/19_2.png) [@kimh](https://discuss.circleci.com/u/kimh)\
**Post date:** [February 22, 2016, 2:34am UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/7 "2016-02-22T02:34:56Z")

</div>

@itajaja Sorry, my approach is a bit rough and doesn’t guarantee what you’ve mentioned. And yes, as @agrothberg mentioned, I think we should be able to do similar approach that CodeShip does.

However, I believe the approach doesn’t work in Docker 1.10. Please see: [Docker 1.10.0 is available (Beta)](https://discuss.circleci.com/t/docker-1-10-0-is-available-beta/2100/15?u=kimh)

---

<div class="post-metadata">

**Author:** ![kimh](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/kimh/32/19_2.png) [@kimh](https://discuss.circleci.com/u/kimh)\
**Post date:** [August 10, 2016, 3:45am UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/8 "2016-08-10T03:45:34Z")

</div>

I made a shell script that helps the caching issue. [Workaround Docker cache issue with docker-cache-shim](https://discuss.circleci.com/t/workaround-docker-cache-issue-with-docker-cache-shim/5591)

It’s working for my workflow and hopefully it does for others.

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/circleci/original/3X/5/1/511608acda8e85906e15909b57bd0a46c1dbe291.png) [@system](https://discuss.circleci.com/u/system)\
**Post date:** [June 18, 2018, 11:42am UTC](https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784/9 "2018-06-18T11:42:07Z")

</div>

Closed on June 18, 2018, 11:42am UTC


