diff --git a/Dockerfile.buildx b/Dockerfile.buildx index b4c5a391e7cb2..1f430f8b5af4a 100644 --- a/Dockerfile.buildx +++ b/Dockerfile.buildx @@ -1,14 +1,27 @@ ARG GO_VERSION=1.12.10 -FROM golang:${GO_VERSION}-stretch +ARG BUILDX_COMMIT=v0.3.1 ARG BUILDX_REPO=https://github.com/docker/buildx.git + +FROM golang:${GO_VERSION}-stretch AS build +ARG BUILDX_REPO RUN git clone "${BUILDX_REPO}" /buildx WORKDIR /buildx -ARG BUILDX_COMMIT=master +ARG BUILDX_COMMIT RUN git fetch origin "${BUILDX_COMMIT}":build && git checkout build RUN go mod download ARG GOOS ARG GOARCH # Keep these essentially no-op var settings for debug purposes. # It allows us to see what the GOOS/GOARCH that's being built for is. -RUN GOOS=${GOOS} GOARCH=${GOARCH} go build -ldflags '-X github.com/docker/buildx/version.Version=${BUILDX_COMMIT} -X github.com/docker/buildx/version.Revision=${BUILDX_COMMIT} -X github.com/docker/buildx/version.Package=github.com/docker/buildx' -o /usr/bin/buildx ./cmd/buildx -ENTRYPOINT ["/usr/bin/buildx"] \ No newline at end of file +RUN GOOS="${GOOS}" GOARCH="${GOARCH}" BUILDX_COMMIT="${BUILDX_COMMIT}"; \ + pkg="github.com/docker/buildx"; \ + ldflags="\ + -X \"${pkg}/version.Version=$(git describe --tags)\" \ + -X \"${pkg}/version.Revision=$(git rev-parse --short HEAD)\" \ + -X \"${pkg}/version.Package=buildx\" \ + "; \ + go build -ldflags "${ldflags}" -o /usr/bin/buildx ./cmd/buildx + +FROM golang:${GO_VERSION}-stretch +COPY --from=build /usr/bin/buildx /usr/bin/buildx +ENTRYPOINT ["/usr/bin/buildx"] diff --git a/Jenkinsfile b/Jenkinsfile index b3c76070af477..43472c5472b45 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -377,8 +377,12 @@ pipeline { expression { params.s390x } } agent { label 's390x-ubuntu-1604' } - // s390x machines run on Docker 18.06, and buildkit has some bugs on that version - environment { DOCKER_BUILDKIT = '0' } + // s390x machines run on Docker 18.06, and buildkit has some + // bugs on that version. Build and use buildx instead. + environment { + USE_BUILDX = '1' + DOCKER_BUILDKIT = '0' + } stages { stage("Print info") { @@ -486,8 +490,12 @@ pipeline { expression { params.s390x } } agent { label 's390x-ubuntu-1604' } - // s390x machines run on Docker 18.06, and buildkit has some bugs on that version - environment { DOCKER_BUILDKIT = '0' } + // s390x machines run on Docker 18.06, and buildkit has some + // bugs on that version. Build and use buildx instead. + environment { + USE_BUILDX = '1' + DOCKER_BUILDKIT = '0' + } stages { stage("Print info") { @@ -571,8 +579,12 @@ pipeline { expression { params.ppc64le } } agent { label 'ppc64le-ubuntu-1604' } - // ppc64le machines run on Docker 18.06, and buildkit has some bugs on that version - environment { DOCKER_BUILDKIT = '0' } + // ppc64le machines run on Docker 18.06, and buildkit has some + // bugs on that version. Build and use buildx instead. + environment { + USE_BUILDX = '1' + DOCKER_BUILDKIT = '0' + } stages { stage("Print info") { @@ -680,8 +692,12 @@ pipeline { expression { params.ppc64le } } agent { label 'ppc64le-ubuntu-1604' } - // ppc64le machines run on Docker 18.06, and buildkit has some bugs on that version - environment { DOCKER_BUILDKIT = '0' } + // ppc64le machines run on Docker 18.06, and buildkit has some + // bugs on that version. Build and use buildx instead. + environment { + USE_BUILDX = '1' + DOCKER_BUILDKIT = '0' + } stages { stage("Print info") { diff --git a/Makefile b/Makefile index a075f64aaa260..ab02c1669d82d 100644 --- a/Makefile +++ b/Makefile @@ -247,21 +247,25 @@ swagger-docs: ## preview the API documentation .PHONY: buildx ifeq ($(BUILDX), bundles/buildx) -buildx: bundles/buildx # build buildx cli tool -else -buildx: +buildx: bundles/buildx ## build buildx cli tool endif -bundles/buildx: BUILDX_DOCKERFILE ?= Dockerfile.buildx -bundles/buildx: BUILDX_COMMIT ?= v0.3.0 +# This intentionally is not using the `--output` flag from the docker CLI, which +# is a buildkit option. The idea here being that if buildx is being used, it's +# because buildkit is not supported natively bundles/buildx: bundles ## build buildx CLI tool - # This intetionally is not using the `--output` flag from the docker CLI which is a buildkit option - # The idea here being that if buildx is being used, it's because buildkit is not supported natively - docker build -f $(BUILDX_DOCKERFILE) -t "moby-buildx:$(BUILDX_COMMIT)" \ + docker build -f $${BUILDX_DOCKERFILE:-Dockerfile.buildx} -t "moby-buildx:$${BUILDX_COMMIT:-latest}" \ --build-arg BUILDX_COMMIT \ --build-arg BUILDX_REPO \ --build-arg GOOS=$$(if [ -n "$(GOOS)" ]; then echo $(GOOS); else go env GOHOSTOS || uname | awk '{print tolower($$0)}' || true; fi) \ --build-arg GOARCH=$$(if [ -n "$(GOARCH)" ]; then echo $(GOARCH); else go env GOHOSTARCH || true; fi) \ - . && \ - id=$$(docker create moby-buildx:$(BUILDX_COMMIT)); \ - if [ -n "$${id}" ]; then docker cp $${id}:/usr/bin/buildx $@ && touch $@; docker rm -f $${id}; fi + . + + id=$$(docker create moby-buildx:$${BUILDX_COMMIT:-latest}); \ + if [ -n "$${id}" ]; then \ + docker cp $${id}:/usr/bin/buildx $@ \ + && touch $@; \ + docker rm -f $${id}; \ + fi + + $@ version