github.com/jfrazelle/docker@v1.1.2-0.20210712172922-bf78e25fe508/Dockerfile (about) 1 # syntax=docker/dockerfile:1.2 2 3 ARG CROSS="false" 4 ARG SYSTEMD="false" 5 # IMPORTANT: When updating this please note that stdlib archive/tar pkg is vendored 6 ARG GO_VERSION=1.16.5 7 ARG DEBIAN_FRONTEND=noninteractive 8 ARG VPNKIT_VERSION=0.5.0 9 ARG DOCKER_BUILDTAGS="apparmor seccomp" 10 11 ARG BASE_DEBIAN_DISTRO="buster" 12 ARG GOLANG_IMAGE="golang:${GO_VERSION}-${BASE_DEBIAN_DISTRO}" 13 14 FROM ${GOLANG_IMAGE} AS base 15 RUN echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache 16 ARG APT_MIRROR 17 RUN sed -ri "s/(httpredir|deb).debian.org/${APT_MIRROR:-deb.debian.org}/g" /etc/apt/sources.list \ 18 && sed -ri "s/(security).debian.org/${APT_MIRROR:-security.debian.org}/g" /etc/apt/sources.list 19 ENV GO111MODULE=off 20 21 FROM base AS criu 22 ARG DEBIAN_FRONTEND 23 ADD --chmod=0644 https://download.opensuse.org/repositories/devel:/tools:/criu/Debian_10/Release.key /etc/apt/trusted.gpg.d/criu.gpg.asc 24 # FIXME: temporarily doing a manual chmod as workaround for https://github.com/moby/buildkit/issues/2114 25 RUN --mount=type=cache,sharing=locked,id=moby-criu-aptlib,target=/var/lib/apt \ 26 --mount=type=cache,sharing=locked,id=moby-criu-aptcache,target=/var/cache/apt \ 27 chmod 0644 /etc/apt/trusted.gpg.d/criu.gpg.asc \ 28 && echo 'deb https://download.opensuse.org/repositories/devel:/tools:/criu/Debian_10/ /' > /etc/apt/sources.list.d/criu.list \ 29 && apt-get update \ 30 && apt-get install -y --no-install-recommends criu \ 31 && install -D /usr/sbin/criu /build/criu 32 33 FROM base AS registry 34 WORKDIR /go/src/github.com/docker/distribution 35 # Install two versions of the registry. The first one is a recent version that 36 # supports both schema 1 and 2 manifests. The second one is an older version that 37 # only supports schema1 manifests. This allows integration-cli tests to cover 38 # push/pull with both schema1 and schema2 manifests. 39 # The old version of the registry is not working on arm64, so installation is 40 # skipped on that architecture. 41 ENV REGISTRY_COMMIT_SCHEMA1 ec87e9b6971d831f0eff752ddb54fb64693e51cd 42 ENV REGISTRY_COMMIT 47a064d4195a9b56133891bbb13620c3ac83a827 43 RUN --mount=type=cache,target=/root/.cache/go-build \ 44 --mount=type=cache,target=/go/pkg/mod \ 45 --mount=type=tmpfs,target=/go/src/ \ 46 set -x \ 47 && git clone https://github.com/docker/distribution.git . \ 48 && git checkout -q "$REGISTRY_COMMIT" \ 49 && GOPATH="/go/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \ 50 go build -buildmode=pie -o /build/registry-v2 github.com/docker/distribution/cmd/registry \ 51 && case $(dpkg --print-architecture) in \ 52 amd64|armhf|ppc64*|s390x) \ 53 git checkout -q "$REGISTRY_COMMIT_SCHEMA1"; \ 54 GOPATH="/go/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH"; \ 55 go build -buildmode=pie -o /build/registry-v2-schema1 github.com/docker/distribution/cmd/registry; \ 56 ;; \ 57 esac 58 59 FROM base AS swagger 60 WORKDIR $GOPATH/src/github.com/go-swagger/go-swagger 61 # Install go-swagger for validating swagger.yaml 62 # This is https://github.com/kolyshkin/go-swagger/tree/golang-1.13-fix 63 # TODO: move to under moby/ or fix upstream go-swagger to work for us. 64 ENV GO_SWAGGER_COMMIT c56166c036004ba7a3a321e5951ba472b9ae298c 65 RUN --mount=type=cache,target=/root/.cache/go-build \ 66 --mount=type=cache,target=/go/pkg/mod \ 67 --mount=type=tmpfs,target=/go/src/ \ 68 set -x \ 69 && git clone https://github.com/kolyshkin/go-swagger.git . \ 70 && git checkout -q "$GO_SWAGGER_COMMIT" \ 71 && go build -o /build/swagger github.com/go-swagger/go-swagger/cmd/swagger 72 73 FROM debian:${BASE_DEBIAN_DISTRO} AS frozen-images 74 ARG DEBIAN_FRONTEND 75 RUN --mount=type=cache,sharing=locked,id=moby-frozen-images-aptlib,target=/var/lib/apt \ 76 --mount=type=cache,sharing=locked,id=moby-frozen-images-aptcache,target=/var/cache/apt \ 77 apt-get update && apt-get install -y --no-install-recommends \ 78 ca-certificates \ 79 curl \ 80 jq 81 # Get useful and necessary Hub images so we can "docker load" locally instead of pulling 82 COPY contrib/download-frozen-image-v2.sh / 83 ARG TARGETARCH 84 RUN /download-frozen-image-v2.sh /build \ 85 buildpack-deps:buster@sha256:d0abb4b1e5c664828b93e8b6ac84d10bce45ee469999bef88304be04a2709491 \ 86 busybox:latest@sha256:95cf004f559831017cdf4628aaf1bb30133677be8702a8c5f2994629f637a209 \ 87 busybox:glibc@sha256:1f81263701cddf6402afe9f33fca0266d9fff379e59b1748f33d3072da71ee85 \ 88 debian:bullseye@sha256:7190e972ab16aefea4d758ebe42a293f4e5c5be63595f4d03a5b9bf6839a4344 \ 89 hello-world:latest@sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9 \ 90 arm32v7/hello-world:latest@sha256:50b8560ad574c779908da71f7ce370c0a2471c098d44d1c8f6b513c5a55eeeb1 91 # See also frozenImages in "testutil/environment/protect.go" (which needs to be updated when adding images to this list) 92 93 FROM base AS cross-false 94 95 FROM --platform=linux/amd64 base AS cross-true 96 ARG DEBIAN_FRONTEND 97 RUN dpkg --add-architecture arm64 98 RUN dpkg --add-architecture armel 99 RUN dpkg --add-architecture armhf 100 RUN dpkg --add-architecture ppc64el 101 RUN dpkg --add-architecture s390x 102 RUN --mount=type=cache,sharing=locked,id=moby-cross-true-aptlib,target=/var/lib/apt \ 103 --mount=type=cache,sharing=locked,id=moby-cross-true-aptcache,target=/var/cache/apt \ 104 apt-get update && apt-get install -y --no-install-recommends \ 105 crossbuild-essential-arm64 \ 106 crossbuild-essential-armel \ 107 crossbuild-essential-armhf \ 108 crossbuild-essential-ppc64el \ 109 crossbuild-essential-s390x 110 111 FROM cross-${CROSS} as dev-base 112 113 FROM dev-base AS runtime-dev-cross-false 114 ARG DEBIAN_FRONTEND 115 RUN echo 'deb http://deb.debian.org/debian buster-backports main' > /etc/apt/sources.list.d/backports.list 116 RUN --mount=type=cache,sharing=locked,id=moby-cross-false-aptlib,target=/var/lib/apt \ 117 --mount=type=cache,sharing=locked,id=moby-cross-false-aptcache,target=/var/cache/apt \ 118 apt-get update && apt-get install -y --no-install-recommends \ 119 binutils-mingw-w64 \ 120 g++-mingw-w64-x86-64 \ 121 libapparmor-dev \ 122 libbtrfs-dev \ 123 libdevmapper-dev \ 124 libseccomp-dev/buster-backports \ 125 libsystemd-dev \ 126 libudev-dev 127 128 FROM --platform=linux/amd64 runtime-dev-cross-false AS runtime-dev-cross-true 129 ARG DEBIAN_FRONTEND 130 # These crossbuild packages rely on gcc-<arch>, but this doesn't want to install 131 # on non-amd64 systems. 132 # Additionally, the crossbuild-amd64 is currently only on debian:buster, so 133 # other architectures cannnot crossbuild amd64. 134 RUN --mount=type=cache,sharing=locked,id=moby-cross-true-aptlib,target=/var/lib/apt \ 135 --mount=type=cache,sharing=locked,id=moby-cross-true-aptcache,target=/var/cache/apt \ 136 apt-get update && apt-get install -y --no-install-recommends \ 137 libapparmor-dev:arm64 \ 138 libapparmor-dev:armel \ 139 libapparmor-dev:armhf \ 140 libapparmor-dev:ppc64el \ 141 libapparmor-dev:s390x 142 143 FROM runtime-dev-cross-${CROSS} AS runtime-dev 144 145 FROM base AS tomll 146 ARG GOTOML_VERSION 147 RUN --mount=type=cache,target=/root/.cache/go-build \ 148 --mount=type=cache,target=/go/pkg/mod \ 149 --mount=type=bind,src=hack/dockerfile/install/tomll.installer,target=/tmp/install/tomll.installer \ 150 . /tmp/install/tomll.installer && PREFIX=/build install_tomll 151 152 FROM base AS vndr 153 ARG VNDR_COMMIT 154 RUN --mount=type=cache,target=/root/.cache/go-build \ 155 --mount=type=cache,target=/go/pkg/mod \ 156 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 157 PREFIX=/build /tmp/install/install.sh vndr 158 159 FROM dev-base AS containerd 160 ARG DEBIAN_FRONTEND 161 RUN --mount=type=cache,sharing=locked,id=moby-containerd-aptlib,target=/var/lib/apt \ 162 --mount=type=cache,sharing=locked,id=moby-containerd-aptcache,target=/var/cache/apt \ 163 apt-get update && apt-get install -y --no-install-recommends \ 164 libbtrfs-dev 165 ARG CONTAINERD_COMMIT 166 RUN --mount=type=cache,target=/root/.cache/go-build \ 167 --mount=type=cache,target=/go/pkg/mod \ 168 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 169 PREFIX=/build /tmp/install/install.sh containerd 170 171 FROM base AS golangci_lint 172 ARG GOLANGCI_LINT_COMMIT 173 RUN --mount=type=cache,target=/root/.cache/go-build \ 174 --mount=type=cache,target=/go/pkg/mod \ 175 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 176 PREFIX=/build /tmp/install/install.sh golangci_lint 177 178 FROM base AS gotestsum 179 ARG GOTESTSUM_COMMIT 180 RUN --mount=type=cache,target=/root/.cache/go-build \ 181 --mount=type=cache,target=/go/pkg/mod \ 182 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 183 PREFIX=/build /tmp/install/install.sh gotestsum 184 185 FROM base AS shfmt 186 ARG SHFMT_COMMIT 187 RUN --mount=type=cache,target=/root/.cache/go-build \ 188 --mount=type=cache,target=/go/pkg/mod \ 189 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 190 PREFIX=/build /tmp/install/install.sh shfmt 191 192 FROM dev-base AS dockercli 193 ARG DOCKERCLI_CHANNEL 194 ARG DOCKERCLI_VERSION 195 RUN --mount=type=cache,target=/root/.cache/go-build \ 196 --mount=type=cache,target=/go/pkg/mod \ 197 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 198 PREFIX=/build /tmp/install/install.sh dockercli 199 200 FROM runtime-dev AS runc 201 ARG RUNC_COMMIT 202 ARG RUNC_BUILDTAGS 203 RUN --mount=type=cache,target=/root/.cache/go-build \ 204 --mount=type=cache,target=/go/pkg/mod \ 205 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 206 PREFIX=/build /tmp/install/install.sh runc 207 208 FROM dev-base AS tini 209 ARG DEBIAN_FRONTEND 210 ARG TINI_COMMIT 211 RUN --mount=type=cache,sharing=locked,id=moby-tini-aptlib,target=/var/lib/apt \ 212 --mount=type=cache,sharing=locked,id=moby-tini-aptcache,target=/var/cache/apt \ 213 apt-get update && apt-get install -y --no-install-recommends \ 214 cmake \ 215 vim-common 216 RUN --mount=type=cache,target=/root/.cache/go-build \ 217 --mount=type=cache,target=/go/pkg/mod \ 218 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 219 PREFIX=/build /tmp/install/install.sh tini 220 221 FROM dev-base AS rootlesskit 222 ARG ROOTLESSKIT_COMMIT 223 RUN --mount=type=cache,target=/root/.cache/go-build \ 224 --mount=type=cache,target=/go/pkg/mod \ 225 --mount=type=bind,src=hack/dockerfile/install,target=/tmp/install \ 226 PREFIX=/build /tmp/install/install.sh rootlesskit 227 COPY ./contrib/dockerd-rootless.sh /build 228 COPY ./contrib/dockerd-rootless-setuptool.sh /build 229 230 FROM --platform=amd64 djs55/vpnkit:${VPNKIT_VERSION} AS vpnkit-amd64 231 232 FROM --platform=arm64 djs55/vpnkit:${VPNKIT_VERSION} AS vpnkit-arm64 233 234 FROM scratch AS vpnkit 235 COPY --from=vpnkit-amd64 /vpnkit /build/vpnkit.x86_64 236 COPY --from=vpnkit-arm64 /vpnkit /build/vpnkit.aarch64 237 238 # TODO: Some of this is only really needed for testing, it would be nice to split this up 239 FROM runtime-dev AS dev-systemd-false 240 ARG DEBIAN_FRONTEND 241 RUN groupadd -r docker 242 RUN useradd --create-home --gid docker unprivilegeduser \ 243 && mkdir -p /home/unprivilegeduser/.local/share/docker \ 244 && chown -R unprivilegeduser /home/unprivilegeduser 245 # Let us use a .bashrc file 246 RUN ln -sfv /go/src/github.com/docker/docker/.bashrc ~/.bashrc 247 # Activate bash completion and include Docker's completion if mounted with DOCKER_BASH_COMPLETION_PATH 248 RUN echo "source /usr/share/bash-completion/bash_completion" >> /etc/bash.bashrc 249 RUN ln -s /usr/local/completion/bash/docker /etc/bash_completion.d/docker 250 RUN ldconfig 251 # This should only install packages that are specifically needed for the dev environment and nothing else 252 # Do you really need to add another package here? Can it be done in a different build stage? 253 RUN --mount=type=cache,sharing=locked,id=moby-dev-aptlib,target=/var/lib/apt \ 254 --mount=type=cache,sharing=locked,id=moby-dev-aptcache,target=/var/cache/apt \ 255 apt-get update && apt-get install -y --no-install-recommends \ 256 apparmor \ 257 aufs-tools \ 258 bash-completion \ 259 bzip2 \ 260 iptables \ 261 jq \ 262 libcap2-bin \ 263 libnet1 \ 264 libnl-3-200 \ 265 libprotobuf-c1 \ 266 net-tools \ 267 patch \ 268 pigz \ 269 python3-pip \ 270 python3-setuptools \ 271 python3-wheel \ 272 sudo \ 273 thin-provisioning-tools \ 274 uidmap \ 275 vim \ 276 vim-common \ 277 xfsprogs \ 278 xz-utils \ 279 zip 280 281 282 # Switch to use iptables instead of nftables (to match the CI hosts) 283 # TODO use some kind of runtime auto-detection instead if/when nftables is supported (https://github.com/moby/moby/issues/26824) 284 RUN update-alternatives --set iptables /usr/sbin/iptables-legacy || true \ 285 && update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy || true \ 286 && update-alternatives --set arptables /usr/sbin/arptables-legacy || true 287 288 RUN pip3 install yamllint==1.26.1 289 290 COPY --from=dockercli /build/ /usr/local/cli 291 COPY --from=frozen-images /build/ /docker-frozen-images 292 COPY --from=swagger /build/ /usr/local/bin/ 293 COPY --from=tomll /build/ /usr/local/bin/ 294 COPY --from=tini /build/ /usr/local/bin/ 295 COPY --from=registry /build/ /usr/local/bin/ 296 COPY --from=criu /build/ /usr/local/bin/ 297 COPY --from=vndr /build/ /usr/local/bin/ 298 COPY --from=gotestsum /build/ /usr/local/bin/ 299 COPY --from=golangci_lint /build/ /usr/local/bin/ 300 COPY --from=shfmt /build/ /usr/local/bin/ 301 COPY --from=runc /build/ /usr/local/bin/ 302 COPY --from=containerd /build/ /usr/local/bin/ 303 COPY --from=rootlesskit /build/ /usr/local/bin/ 304 COPY --from=vpnkit /build/ /usr/local/bin/ 305 ENV PATH=/usr/local/cli:$PATH 306 ARG DOCKER_BUILDTAGS 307 ENV DOCKER_BUILDTAGS="${DOCKER_BUILDTAGS}" 308 WORKDIR /go/src/github.com/docker/docker 309 VOLUME /var/lib/docker 310 VOLUME /home/unprivilegeduser/.local/share/docker 311 # Wrap all commands in the "docker-in-docker" script to allow nested containers 312 ENTRYPOINT ["hack/dind"] 313 314 FROM dev-systemd-false AS dev-systemd-true 315 RUN --mount=type=cache,sharing=locked,id=moby-dev-aptlib,target=/var/lib/apt \ 316 --mount=type=cache,sharing=locked,id=moby-dev-aptcache,target=/var/cache/apt \ 317 apt-get update && apt-get install -y --no-install-recommends \ 318 dbus \ 319 dbus-user-session \ 320 systemd \ 321 systemd-sysv 322 RUN mkdir -p hack \ 323 && curl -o hack/dind-systemd https://raw.githubusercontent.com/AkihiroSuda/containerized-systemd/b70bac0daeea120456764248164c21684ade7d0d/docker-entrypoint.sh \ 324 && chmod +x hack/dind-systemd 325 ENTRYPOINT ["hack/dind-systemd"] 326 327 FROM dev-systemd-${SYSTEMD} AS dev 328 329 FROM runtime-dev AS binary-base 330 ARG DOCKER_GITCOMMIT=HEAD 331 ENV DOCKER_GITCOMMIT=${DOCKER_GITCOMMIT} 332 ARG VERSION 333 ENV VERSION=${VERSION} 334 ARG PLATFORM 335 ENV PLATFORM=${PLATFORM} 336 ARG PRODUCT 337 ENV PRODUCT=${PRODUCT} 338 ARG DEFAULT_PRODUCT_LICENSE 339 ENV DEFAULT_PRODUCT_LICENSE=${DEFAULT_PRODUCT_LICENSE} 340 ARG DOCKER_BUILDTAGS 341 ENV DOCKER_BUILDTAGS="${DOCKER_BUILDTAGS}" 342 ENV PREFIX=/build 343 # TODO: This is here because hack/make.sh binary copies these extras binaries 344 # from $PATH into the bundles dir. 345 # It would be nice to handle this in a different way. 346 COPY --from=tini /build/ /usr/local/bin/ 347 COPY --from=runc /build/ /usr/local/bin/ 348 COPY --from=containerd /build/ /usr/local/bin/ 349 COPY --from=rootlesskit /build/ /usr/local/bin/ 350 COPY --from=vpnkit /build/ /usr/local/bin/ 351 WORKDIR /go/src/github.com/docker/docker 352 353 FROM binary-base AS build-binary 354 RUN --mount=type=cache,target=/root/.cache/go-build \ 355 --mount=type=bind,target=/go/src/github.com/docker/docker \ 356 hack/make.sh binary 357 358 FROM binary-base AS build-dynbinary 359 RUN --mount=type=cache,target=/root/.cache/go-build \ 360 --mount=type=bind,target=/go/src/github.com/docker/docker \ 361 hack/make.sh dynbinary 362 363 FROM binary-base AS build-cross 364 ARG DOCKER_CROSSPLATFORMS 365 RUN --mount=type=cache,target=/root/.cache/go-build \ 366 --mount=type=bind,target=/go/src/github.com/docker/docker \ 367 --mount=type=tmpfs,target=/go/src/github.com/docker/docker/autogen \ 368 hack/make.sh cross 369 370 FROM scratch AS binary 371 COPY --from=build-binary /build/bundles/ / 372 373 FROM scratch AS dynbinary 374 COPY --from=build-dynbinary /build/bundles/ / 375 376 FROM scratch AS cross 377 COPY --from=build-cross /build/bundles/ / 378 379 FROM dev AS final 380 COPY . /go/src/github.com/docker/docker