From 81741668d521cc648d5518012e7d10a77da7b422 Mon Sep 17 00:00:00 2001 From: stubbfel Date: Sat, 2 Dec 2023 15:23:33 +0000 Subject: [PATCH] add presentation --- .devcontainer/devcontainer.json | 16 +- ...ping.Dockerfile => 2-combining.Dockerfile} | 0 .dockerignore | 6 +- .gitignore | 3 + .slides/openspacet-2312.adoc | 173 ++++++++++++++++++ docToolchainConfig.groovy | 10 + 6 files changed, 205 insertions(+), 3 deletions(-) rename .docker-files/{2-grouping.Dockerfile => 2-combining.Dockerfile} (100%) create mode 100644 .gitignore create mode 100644 .slides/openspacet-2312.adoc create mode 100644 docToolchainConfig.groovy diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f0917c1..5c0dd4d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,12 +6,24 @@ "image": "mcr.microsoft.com/devcontainers/base:jammy", "features": { "ghcr.io/devcontainers/features/docker-in-docker:2": {}, - "ghcr.io/devcontainers-contrib/features/doctoolchain-sdkman:2": {} + "ghcr.io/devcontainers-contrib/features/doctoolchain-sdkman:2": { + "version" : "3.1.2", + "jdkVersion": "17" + }, + "ghcr.io/devcontainers-contrib/features/http-server:1": {} }, + "postCreateCommand": "curl -Lo dtcw https://doctoolchain.org/dtcw && chmod +x dtcw", "remoteUser": "vscode", "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,Z", "workspaceFolder": "/workspace", "runArgs": ["--userns=keep-id"], - "containerUser": "vscode" + "containerUser": "vscode", + "customizations": { + "vscode": { + "extensions": [ + "asciidoctor.asciidoctor-vscode" + ] + } + } } diff --git a/.docker-files/2-grouping.Dockerfile b/.docker-files/2-combining.Dockerfile similarity index 100% rename from .docker-files/2-grouping.Dockerfile rename to .docker-files/2-combining.Dockerfile diff --git a/.dockerignore b/.dockerignore index 1866e77..cb16d14 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,8 @@ .devcontainer .git .docker-files -.dockerignore \ No newline at end of file +.dockerignore +.gradle +.slides +.build +dtcw \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e17261e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +dtcw +.gradle +.build \ No newline at end of file diff --git a/.slides/openspacet-2312.adoc b/.slides/openspacet-2312.adoc new file mode 100644 index 0000000..cd0e245 --- /dev/null +++ b/.slides/openspacet-2312.adoc @@ -0,0 +1,173 @@ += 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 diff --git a/docToolchainConfig.groovy b/docToolchainConfig.groovy new file mode 100644 index 0000000..a559eea --- /dev/null +++ b/docToolchainConfig.groovy @@ -0,0 +1,10 @@ +// Path where docToolchain creates its artifacts. +outputPath = '.build' + +// Path where the docToolchain will search for the input files. +inputPath = '.slides'; + +// Define which formats should be processed. +inputFiles = [ + [file: 'openspacet-2312.adoc', formats: ['revealjs']], +] \ No newline at end of file