├── .github └── workflows │ └── dockerimage.yml ├── Dockerfile └── README.md /.github/workflows/dockerimage.yml: -------------------------------------------------------------------------------- 1 | # Increase number to trigger CI -> 1 2 | name: The showdown 3 | on: 4 | push: {} 5 | jobs: 6 | build_no_cache: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - run: docker build . -t thing 11 | build_no_cache_buildkit: 12 | env: 13 | DOCKER_BUILDKIT: '1' 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v2 17 | - run: docker build . -t thing 18 | build_with_docker_save_load: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v2 22 | - id: cache-docker 23 | uses: actions/cache@v1 24 | with: 25 | path: /tmp/docker-save 26 | key: docker-save-${{ hashFiles('Dockerfile') }} 27 | - run: docker load -i /tmp/docker-save/snapshot.tar || true 28 | if: steps.cache-docker.outputs.cache-hit == 'true' 29 | - run: docker build . -t thing --cache-from=thing-cache 30 | - run: docker tag thing thing-cache && mkdir -p /tmp/docker-save && docker save thing-cache -o /tmp/docker-save/snapshot.tar && ls -lh /tmp/docker-save || true 31 | if: always() && steps.cache-docker.outputs.cache-hit != 'true' 32 | build_with_local_registry: 33 | runs-on: ubuntu-latest 34 | steps: 35 | - uses: actions/checkout@v2 36 | - id: cache-docker 37 | uses: actions/cache@v1 38 | with: 39 | path: /tmp/docker-registry 40 | key: docker-registry-no-buildkit-${{ hashFiles('Dockerfile') }} 41 | - run: docker run -d -p 5000:5000 --restart=always --name registry -v /tmp/docker-registry:/var/lib/registry registry:2 && npx wait-on tcp:5000 42 | - run: docker pull localhost:5000/thing || true 43 | - run: docker build . -t thing --cache-from=localhost:5000/thing 44 | - run: docker tag thing localhost:5000/thing && docker push localhost:5000/thing || true 45 | if: steps.cache.outputs.cache-hit != 'true' 46 | build_with_local_registry_buildkit: 47 | env: 48 | DOCKER_BUILDKIT: '1' 49 | runs-on: ubuntu-latest 50 | steps: 51 | - uses: actions/checkout@v2 52 | - id: cache-docker 53 | uses: actions/cache@v1 54 | with: 55 | path: /tmp/docker-registry 56 | key: docker-registry-buildkit-${{ hashFiles('Dockerfile') }} 57 | - run: docker run -d -p 5000:5000 --restart=always --name registry -v /tmp/docker-registry:/var/lib/registry registry:2 && npx wait-on tcp:5000 58 | - run: docker build . -t thing --cache-from=localhost:5000/thing --build-arg BUILDKIT_INLINE_CACHE=1 59 | - run: docker tag thing localhost:5000/thing && docker push localhost:5000/thing || true 60 | if: steps.cache.outputs.cache-hit != 'true' 61 | build_with_gpr: 62 | runs-on: ubuntu-latest 63 | steps: 64 | - uses: actions/checkout@v2 65 | - run: echo ${{ secrets.GITHUB_TOKEN }} | docker login docker.pkg.github.com -u $GITHUB_ACTOR --password-stdin 66 | - run: docker pull docker.pkg.github.com/$GITHUB_REPOSITORY/build-cache-no-buildkit || true 67 | - run: docker build . -t thing --cache-from=docker.pkg.github.com/$GITHUB_REPOSITORY/build-cache-no-buildkit 68 | - run: docker tag thing docker.pkg.github.com/$GITHUB_REPOSITORY/build-cache-no-buildkit && docker push docker.pkg.github.com/$GITHUB_REPOSITORY/build-cache-no-buildkit || true 69 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:12 2 | RUN yarn create react-app my-react-app 3 | RUN cd my-react-app && yarn build 4 | RUN npm install -g @vue/cli && (yes | vue create my-vue-app --default) 5 | RUN cd my-vue-app && yarn build 6 | RUN mkdir -p my-tests && cd my-tests && yarn add playwright 7 | # test 8 | # test 9 | # test 10 | # test 11 | # test 12 | # test 13 | # test 14 | # test 15 | # test 16 | # test 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # github-actions-docker-layer-caching-poc 2 | 3 | Some analysis to find out what approach of caching Docker builds leads to most performance gain. --------------------------------------------------------------------------------