174 lines
3.4 KiB
Plaintext
174 lines
3.4 KiB
Plaintext
= Docker Build Optimization
|
|
:source-highlighter: highlightjs
|
|
|
|
== Why Optimize Docker Builds?
|
|
|
|
* Faster build times
|
|
* Reduced image size
|
|
|
|
== Optimization Strategies
|
|
|
|
* Reordering
|
|
* Combining
|
|
* Mounting and local Cache
|
|
* Multi-stage builds
|
|
* Choose of base image
|
|
* Clean docker build context
|
|
* Remote Caching
|
|
|
|
== Demo
|
|
|
|
=== Base Image
|
|
|
|
[source,docker]
|
|
----
|
|
include::../.docker-files/0-origin.Dockerfile[]
|
|
----
|
|
|
|
[.notes]
|
|
--
|
|
---
|
|
docker build -f .docker-files/0-origin.Dockerfile -t demo/base .
|
|
docker build -f .docker-files/0-origin.Dockerfile -t demo/base .
|
|
touch foo
|
|
docker build -f .docker-files/0-origin.Dockerfile -t demo/base .
|
|
dive demo/base
|
|
--
|
|
|
|
=== Reordering
|
|
|
|
[source,docker]
|
|
----
|
|
include::../.docker-files/1-reordering.Dockerfile[]
|
|
----
|
|
|
|
[.notes]
|
|
--
|
|
* reduce build time by layer cache
|
|
|
|
docker build -f .docker-files/1-reordering.Dockerfile -t demo/reorder .
|
|
docker build -f .docker-files/1-reordering.Dockerfile -t demo/reorder .
|
|
touch bar
|
|
docker build -f .docker-files/1-reordering.Dockerfile -t demo/reorder .
|
|
dive demo/reorder
|
|
--
|
|
|
|
=== Combining
|
|
|
|
[source,docker]
|
|
----
|
|
include::../.docker-files/2-combining.Dockerfile[]
|
|
----
|
|
|
|
[.notes]
|
|
--
|
|
* reduce layer numbers
|
|
|
|
docker build -f .docker-files/2-combining.Dockerfile -t demo/combine .
|
|
dive demo/combine
|
|
--
|
|
|
|
|
|
=== Mounting and local Cache
|
|
|
|
[source,docker]
|
|
----
|
|
include::../.docker-files/3-mounting.Dockerfile[]
|
|
----
|
|
|
|
[.notes]
|
|
--
|
|
docker build -f .docker-files/3-mounting.Dockerfile -t demo/mounts .
|
|
|
|
* extend intall package list
|
|
|
|
docker build -f .docker-files/3-mounting.Dockerfile -t demo/mounts-2 .
|
|
dive demo/mounts
|
|
--
|
|
|
|
=== Multi-stage builds
|
|
|
|
[source,docker]
|
|
----
|
|
include::../.docker-files/4-multi-stage.Dockerfile[]
|
|
----
|
|
|
|
[.notes]
|
|
--
|
|
* remove all not needed files
|
|
|
|
docker build -f .docker-files/4-multi-stage.Dockerfile -t demo/multistage .
|
|
dive demo/multistage
|
|
--
|
|
|
|
=== Choose of base image
|
|
|
|
[source,docker]
|
|
----
|
|
include::../.docker-files/5-base-image.Dockerfile[]
|
|
----
|
|
|
|
[.notes]
|
|
--
|
|
docker build -f .docker-files/5-base-image.Dockerfile -t demo/alpine .
|
|
dive demo/alpine
|
|
--
|
|
=== Using pinned image
|
|
|
|
[source,docker]
|
|
----
|
|
include::../.docker-files/6-pinimage.Dockerfile[]
|
|
----
|
|
|
|
== Clean docker build context
|
|
|
|
* The `.dockerignore` file excludes unnecessary files from the build context
|
|
|
|
[source,plaintext]
|
|
```
|
|
.git
|
|
.gitignore
|
|
.dockerignore
|
|
*.log
|
|
tmp/*
|
|
```
|
|
|
|
== Remote Caching
|
|
|
|
* other build driver like https://docs.docker.com/build/drivers/[`docker-container`^] supports cache export
|
|
|
|
[source,shell]
|
|
----
|
|
docker buildx build \
|
|
--cache-from myapp:cache \
|
|
--cache-to myapp:cache \
|
|
-t myapp:latest \
|
|
.
|
|
----
|
|
|
|
* Kaniko is a tool to build container images from a Dockerfile, inside a container or Kubernetes cluster.
|
|
|
|
[source,shell]
|
|
----
|
|
kaniko build --cache=true -f Dockerfile.
|
|
----
|
|
|
|
[.notes]
|
|
--
|
|
* It's designed to work without Docker daemon
|
|
* making it suitable for environments with restricted access.
|
|
--
|
|
|
|
|
|
== Resources
|
|
|
|
* Docker Documentation: https://docs.docker.com/
|
|
* Docker Build Best Practices:
|
|
** https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
|
|
** https://docs.docker.com/build/cache/
|
|
* .dockerignore Documentation: https://docs.docker.com/engine/reference/builder/#dockerignore-file
|
|
* Remote Caching with Buildx: https://docs.docker.com/build/cache/backends/
|
|
* Kaniko GitHub Repository: https://github.com/GoogleContainerTools/kaniko
|
|
* Alpine Linux: https://alpinelinux.org/
|
|
* Dive - A tool for exploring each layer in a Docker image: https://github.com/wagoodman/dive
|