# syntax=docker/dockerfile:1.7 ARG GO_VERSION=1.21.9 ARG BASE_DEBIAN_DISTRO="bookworm" ARG GOLANG_IMAGE="golang:${GO_VERSION}-${BASE_DEBIAN_DISTRO}" ARG XX_VERSION=1.4.0 ARG VPNKIT_VERSION=0.5.0 ARG DOCKERCLI_REPOSITORY="https://github.com/docker/cli.git" ARG DOCKERCLI_VERSION=v26.0.0 # cli version used for integration-cli tests ARG DOCKERCLI_INTEGRATION_REPOSITORY="https://github.com/docker/cli.git" ARG DOCKERCLI_INTEGRATION_VERSION=v17.06.2-ce ARG BUILDX_VERSION=0.13.1 ARG COMPOSE_VERSION=v2.25.0 ARG SYSTEMD="false" ARG DOCKER_STATIC=1 # REGISTRY_VERSION specifies the version of the registry to download from # https://hub.docker.com/r/distribution/distribution. This version of # the registry is used to test schema 2 manifests. Generally, the version # specified here should match a current release. ARG REGISTRY_VERSION=2.8.3 # delve is currently only supported on linux/amd64 and linux/arm64; # https://github.com/go-delve/delve/blob/v1.8.1/pkg/proc/native/support_sentinel.go#L1-L6 ARG DELVE_SUPPORTED=${TARGETPLATFORM#linux/amd64} DELVE_SUPPORTED=${DELVE_SUPPORTED#linux/arm64} ARG DELVE_SUPPORTED=${DELVE_SUPPORTED:+"unsupported"} ARG DELVE_SUPPORTED=${DELVE_SUPPORTED:-"supported"} # cross compilation helper FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx # dummy stage to make sure the image is built for deps that don't support some # architectures FROM --platform=$BUILDPLATFORM busybox AS build-dummy RUN mkdir -p /build FROM scratch AS binary-dummy COPY --from=build-dummy /build /build # base FROM --platform=$BUILDPLATFORM ${GOLANG_IMAGE} AS base COPY --from=xx / / RUN echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache RUN apt-get update && apt-get install --no-install-recommends -y file ENV GO111MODULE=off ENV GOTOOLCHAIN=local FROM base AS criu ADD --chmod=0644 https://download.opensuse.org/repositories/devel:/tools:/criu/Debian_11/Release.key /etc/apt/trusted.gpg.d/criu.gpg.asc RUN --mount=type=cache,sharing=locked,id=moby-criu-aptlib,target=/var/lib/apt \ --mount=type=cache,sharing=locked,id=moby-criu-aptcache,target=/var/cache/apt \ echo 'deb https://download.opensuse.org/repositories/devel:/tools:/criu/Debian_12/ /' > /etc/apt/sources.list.d/criu.list \ && apt-get update \ && apt-get install -y --no-install-recommends criu \ && install -D /usr/sbin/criu /build/criu \ && /build/criu --version # registry FROM base AS registry-src WORKDIR /usr/src/registry RUN git init . && git remote add origin "https://github.com/distribution/distribution.git" FROM base AS registry WORKDIR /go/src/github.com/docker/distribution # REGISTRY_VERSION_SCHEMA1 specifies the version of the registry to build and # install from the https://github.com/docker/distribution repository. This is # an older (pre v2.3.0) version of the registry that only supports schema1 # manifests. This version of the registry is not working on arm64, so installation # is skipped on that architecture. ARG REGISTRY_VERSION_SCHEMA1=v2.1.0 ARG TARGETPLATFORM RUN --mount=from=registry-src,src=/usr/src/registry,rw \ --mount=type=cache,target=/root/.cache/go-build,id=registry-build-$TARGETPLATFORM \ --mount=type=cache,target=/go/pkg/mod \ --mount=type=tmpfs,target=/go/src <> /etc/bash.bashrc RUN ln -s /usr/local/completion/bash/docker /etc/bash_completion.d/docker RUN ldconfig # Set dev environment as safe git directory to prevent "dubious ownership" errors # when bind-mounting the source into the dev-container. See https://github.com/moby/moby/pull/44930 RUN git config --global --add safe.directory $GOPATH/src/github.com/docker/docker # This should only install packages that are specifically needed for the dev environment and nothing else # Do you really need to add another package here? Can it be done in a different build stage? RUN --mount=type=cache,sharing=locked,id=moby-dev-aptlib,target=/var/lib/apt \ --mount=type=cache,sharing=locked,id=moby-dev-aptcache,target=/var/cache/apt \ apt-get update && apt-get install -y --no-install-recommends \ apparmor \ bash-completion \ bzip2 \ inetutils-ping \ iproute2 \ iptables \ jq \ libcap2-bin \ libnet1 \ libnl-3-200 \ libprotobuf-c1 \ libyajl2 \ net-tools \ patch \ pigz \ sudo \ systemd-journal-remote \ thin-provisioning-tools \ uidmap \ vim \ vim-common \ xfsprogs \ xz-utils \ zip \ zstd # Switch to use iptables instead of nftables (to match the CI hosts) # TODO use some kind of runtime auto-detection instead if/when nftables is supported (https://github.com/moby/moby/issues/26824) RUN update-alternatives --set iptables /usr/sbin/iptables-legacy || true \ && update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy || true \ && update-alternatives --set arptables /usr/sbin/arptables-legacy || true RUN --mount=type=cache,sharing=locked,id=moby-dev-aptlib,target=/var/lib/apt \ --mount=type=cache,sharing=locked,id=moby-dev-aptcache,target=/var/cache/apt \ apt-get update && apt-get install --no-install-recommends -y \ gcc \ pkg-config \ dpkg-dev \ libapparmor-dev \ libseccomp-dev \ libsecret-1-dev \ libsystemd-dev \ libudev-dev \ yamllint COPY --link --from=dockercli /build/ /usr/local/cli COPY --link --from=dockercli-integration /build/ /usr/local/cli-integration FROM base AS build COPY --from=gowinres /build/ /usr/local/bin/ WORKDIR /go/src/github.com/docker/docker ENV GO111MODULE=off ENV CGO_ENABLED=1 RUN --mount=type=cache,sharing=locked,id=moby-build-aptlib,target=/var/lib/apt \ --mount=type=cache,sharing=locked,id=moby-build-aptcache,target=/var/cache/apt \ apt-get update && apt-get install --no-install-recommends -y \ clang \ lld \ llvm ARG TARGETPLATFORM RUN --mount=type=cache,sharing=locked,id=moby-build-aptlib,target=/var/lib/apt \ --mount=type=cache,sharing=locked,id=moby-build-aptcache,target=/var/cache/apt \ xx-apt-get install --no-install-recommends -y \ dpkg-dev \ gcc \ libapparmor-dev \ libc6-dev \ libseccomp-dev \ libsecret-1-dev \ libsystemd-dev \ libudev-dev \ pkg-config ARG DOCKER_BUILDTAGS ARG DOCKER_DEBUG ARG DOCKER_GITCOMMIT=HEAD ARG DOCKER_LDFLAGS ARG DOCKER_STATIC ARG VERSION ARG PLATFORM ARG PRODUCT ARG DEFAULT_PRODUCT_LICENSE ARG PACKAGER_NAME # PREFIX overrides DEST dir in make.sh script otherwise it fails because of # read only mount in current work dir ENV PREFIX=/tmp RUN < docker buildx bake binary # > DOCKER_STATIC=0 docker buildx bake binary # or # > make binary # > make dynbinary FROM scratch AS binary COPY --from=build /build/ / # usage: # > docker buildx bake all FROM scratch AS all COPY --link --from=tini /build/ / COPY --link --from=runc /build/ / COPY --link --from=containerd /build/ / COPY --link --from=rootlesskit /build/ / COPY --link --from=containerutil /build/ / COPY --link --from=vpnkit / / COPY --link --from=build /build / # smoke tests # usage: # > docker buildx bake binary-smoketest FROM --platform=$TARGETPLATFORM base AS smoketest WORKDIR /usr/local/bin COPY --from=build /build . RUN < make shell # > SYSTEMD=true make shell FROM dev-base AS dev COPY --link . .