diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c5e82d74 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bin \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ea356dc7..7d890676 100644 --- a/Dockerfile +++ b/Dockerfile @@ -38,6 +38,17 @@ WORKDIR /go/src/github.com/docker/cli RUN git clone git://$REPO . && git checkout $BRANCH RUN ./scripts/build/binary +FROM scratch AS binaries-unix +COPY --from=buildx-build /usr/bin/buildx / + +FROM binaries-unix AS binaries-darwin +FROM binaries-unix AS binaries-linux + +FROM scratch AS binaries-windows +COPY --from=buildx-build /usr/bin/buildx /buildx.exe + +FROM binaries-$TARGETOS AS binaries + FROM alpine AS demo-env RUN apk add --no-cache iptables tmux RUN mkdir -p /usr/local/lib/docker/cli-plugins && ln -s /usr/local/bin/buildx /usr/local/lib/docker/cli-plugins/docker-buildx @@ -45,6 +56,6 @@ COPY ./hack/demo-env/entrypoint.sh /usr/local/bin COPY ./hack/demo-env/tmux.conf /root/.tmux.conf COPY --from=dockerd-release /usr/local/bin /usr/local/bin COPY --from=docker-cli-build /go/src/github.com/docker/cli/build/docker /usr/local/bin -COPY --from=buildx-build /usr/bin/buildx /usr/local/bin/ +COPY --from=binaries / /usr/local/bin/ VOLUME /var/lib/docker ENTRYPOINT ["entrypoint.sh"] diff --git a/Makefile b/Makefile index 303ddf36..a631817b 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,13 @@ shell: ./hack/shell +binaries: + ./hack/binaries + lint: ./hack/lint vendor: ./hack/update-vendor -.PHONY: vendor lint shell \ No newline at end of file +.PHONY: vendor lint shell binaries \ No newline at end of file diff --git a/hack/binaries b/hack/binaries new file mode 100755 index 00000000..c71b1f7c --- /dev/null +++ b/hack/binaries @@ -0,0 +1,56 @@ +#!/usr/bin/env bash + +. $(dirname $0)/util + +: ${TARGETPLATFORM=$CLI_PLATFORM} +: ${CONTINUOUS_INTEGRATION=} + +set -ex + +progressFlag="" +if [ "$CONTINUOUS_INTEGRATION" == "true" ]; then progressFlag="--progress=plain"; fi + +binariesDocker() { + mkdir -p bin/tmp + export DOCKER_BUILDKIT=1 + iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX) + + platformFlag="" + if [ -n "$TARGETPLATFORM" ]; then + platformFlag="--build-arg=TARGETPLATFORM=$TARGETPLATFORM" + fi + + docker build $platformFlag --target=binaries --iidfile $iidfile --force-rm . + iid=$(cat $iidfile) + containerID=$(docker create $iid copy) + docker cp $containerID:/ bin/tmp + mv bin/tmp/build* bin/ + rm -rf bin/tmp + docker rm $containerID + docker rmi -f $iid + rm -f $iidfile +} + +binaries() { + platformFlag="" + if [ ! -z "$TARGETPLATFORM" ]; then + platformFlag="--frontend-opt=platform=$TARGETPLATFORM" + fi + buildctl build $progressFlag --frontend=dockerfile.v0 \ + --local context=. --local dockerfile=. \ + --frontend-opt target=binaries $platformFlag \ + --output type=local,dest=./bin/ +} + +case $buildmode in +"buildkit") + binaries + ;; +"docker-buildkit") + binariesDocker + ;; +*) + echo "buildctl or docker with buildkit support is required" + exit 1 + ;; +esac diff --git a/hack/util b/hack/util index 2d11817a..a9ceca35 100755 --- a/hack/util +++ b/hack/util @@ -2,6 +2,7 @@ : ${PREFER_BUILDCTL=} : ${PREFER_LEGACY=} +: ${CLI_PLATFORM=} newerEqualThan() { # $1=minimum wanted version $2=actual-version [ "$1" = "$(printf "$1\n$2" | sort -V | head -n 1)" ] @@ -19,3 +20,13 @@ else buildmode="docker-buildkit"; fi fi + +if [ -z "$CLI_PLATFORM" ]; then + rawos=$(uname -s) + if [ "$rawos" = "Darwin" ]; then + CLI_PLATFORM="darwin/amd64" + elif uname -s | grep MINGW 2>&1 >/dev/null ; then + CLI_PLATFORM="windows/amd64" + fi +fi +