Browse code

Merge pull request #21108 from tianon/detect-daemon-osarch

Adjust "hack/make/.detect-daemon-osarch" to be the source of truth for "platform detection"

Phil Estes authored on 2016/03/16 09:00:55
Showing 3 changed files
... ...
@@ -1,30 +1,8 @@
1 1
 .PHONY: all binary build cross default docs docs-build docs-shell shell test test-docker-py test-integration-cli test-unit validate
2 2
 
3 3
 # get OS/Arch of docker engine
4
-DOCKER_OSARCH := $(shell bash -c 'source hack/make/.detect-daemon-osarch && echo $${DOCKER_ENGINE_OSARCH:+$$DOCKER_CLIENT_OSARCH}')
5
-# default for linux/amd64 and others
6
-DOCKERFILE := Dockerfile
7
-# switch to different Dockerfile for linux/arm
8
-ifeq ($(DOCKER_OSARCH), linux/arm)
9
-	DOCKERFILE := Dockerfile.armhf
10
-else
11
-ifeq ($(DOCKER_OSARCH), linux/arm64)
12
-	DOCKERFILE := Dockerfile.aarch64
13
-else
14
-ifeq ($(DOCKER_OSARCH), linux/ppc64le)
15
-	DOCKERFILE := Dockerfile.ppc64le
16
-else
17
-ifeq ($(DOCKER_OSARCH), linux/s390x)
18
-	DOCKERFILE := Dockerfile.s390x
19
-else
20
-ifeq ($(DOCKER_OSARCH), windows/amd64)
21
-	DOCKERFILE := Dockerfile.windows
22
-endif
23
-endif
24
-endif
25
-endif
26
-endif
27
-export DOCKERFILE
4
+DOCKER_OSARCH := $(shell bash -c 'source hack/make/.detect-daemon-osarch && echo $${DOCKER_ENGINE_OSARCH:-$$DOCKER_CLIENT_OSARCH}')
5
+DOCKERFILE := $(shell bash -c 'source hack/make/.detect-daemon-osarch && echo $${DOCKERFILE}')
28 6
 
29 7
 # env vars passed through directly to Docker's build scripts
30 8
 # to allow things like `make DOCKER_CLIENTONLY=1 binary` easily
... ...
@@ -37,7 +15,6 @@ DOCKER_ENVS := \
37 37
 	-e DOCKER_CLIENTONLY \
38 38
 	-e DOCKER_DEBUG \
39 39
 	-e DOCKER_EXPERIMENTAL \
40
-	-e DOCKERFILE \
41 40
 	-e DOCKER_GRAPHDRIVER \
42 41
 	-e DOCKER_INCREMENTAL_BINARY \
43 42
 	-e DOCKER_REMAP_ROOT \
... ...
@@ -1,34 +1,66 @@
1 1
 #!/bin/bash
2 2
 set -e
3 3
 
4
+docker-version-osarch() {
5
+	local target="$1" # "Client" or "Server"
6
+	local fmtStr="{{.${target}.Os}}/{{.${target}.Arch}}"
7
+	if docker version -f "$fmtStr" 2>/dev/null; then
8
+		# if "docker version -f" works, let's just use that!
9
+		return
10
+	fi
11
+	docker version | awk '
12
+		$1 ~ /^(Client|Server):$/ { section = 0 }
13
+		$1 == "'"$target"':" { section = 1; next }
14
+		section && $1 == "OS/Arch:" { print $2 }
15
+
16
+		# old versions of Docker
17
+		$1 == "OS/Arch" && $2 == "('"${target,,}"'):" { print $3 }
18
+	'
19
+}
20
+
4 21
 # Retrieve OS/ARCH of docker daemon, eg. linux/amd64
5
-export DOCKER_ENGINE_OSARCH="$(docker version | awk '
6
-	$1 == "Client:" { server = 0; next }
7
-	$1 == "Server:" { server = 1; next }
8
-	server && $1 == "OS/Arch:" { print $2 }
9
-')"
22
+export DOCKER_ENGINE_OSARCH="$(docker-version-osarch 'Server')"
10 23
 export DOCKER_ENGINE_GOOS="${DOCKER_ENGINE_OSARCH%/*}"
11 24
 export DOCKER_ENGINE_GOARCH="${DOCKER_ENGINE_OSARCH##*/}"
12 25
 DOCKER_ENGINE_GOARCH=${DOCKER_ENGINE_GOARCH:=amd64}
13 26
 
14 27
 # and the client, just in case
15
-export DOCKER_CLIENT_OSARCH="$(docker version | awk '
16
-	$1 == "Client:" { client = 1; next }
17
-	$1 == "Server:" { client = 0; next }
18
-	client && $1 == "OS/Arch:" { print $2 }
19
-')"
28
+export DOCKER_CLIENT_OSARCH="$(docker-version-osarch 'Client')"
29
+export DOCKER_CLIENT_GOOS="${DOCKER_CLIENT_OSARCH%/*}"
30
+export DOCKER_CLIENT_GOARCH="${DOCKER_CLIENT_OSARCH##*/}"
31
+DOCKER_CLIENT_GOARCH=${DOCKER_CLIENT_GOARCH:=amd64}
20 32
 
21 33
 # Retrieve the architecture used in contrib/builder/(deb|rpm)/$PACKAGE_ARCH/
22
-PACKAGE_ARCH="amd64"
23
-case "$DOCKER_ENGINE_OSARCH" in
24
-	linux/arm)
34
+PACKAGE_ARCH='amd64'
35
+case "${DOCKER_ENGINE_GOARCH:-$DOCKER_CLIENT_GOARCH}" in
36
+	arm)
25 37
 		PACKAGE_ARCH='armhf'
26 38
 		;;
27
-	linux/ppc64le)
28
-		PACKAGE_ARCH='ppc64le'
39
+	arm64)
40
+		PACKAGE_ARCH='aarch64'
29 41
 		;;
30
-	linux/s390x)
31
-		PACKAGE_ARCH='s390x'
42
+	amd64|ppc64le|s390x)
43
+		PACKAGE_ARCH="${DOCKER_ENGINE_GOARCH:-$DOCKER_CLIENT_GOARCH}"
44
+		;;
45
+	*)
46
+		echo >&2 "warning: not sure how to convert '$DOCKER_ENGINE_GOARCH' to a 'Docker' arch, assuming '$PACKAGE_ARCH'"
32 47
 		;;
33 48
 esac
34 49
 export PACKAGE_ARCH
50
+
51
+DOCKERFILE='Dockerfile'
52
+TEST_IMAGE_NAMESPACE=
53
+case "$PACKAGE_ARCH" in
54
+	amd64)
55
+		case "${DOCKER_ENGINE_GOOS:-$DOCKER_CLIENT_GOOS}" in
56
+			windows)
57
+				DOCKERFILE='Dockerfile.windows'
58
+				;;
59
+		esac
60
+		;;
61
+	*)
62
+		DOCKERFILE="Dockerfile.$PACKAGE_ARCH"
63
+		TEST_IMAGE_NAMESPACE="$PACKAGE_ARCH"
64
+		;;
65
+esac
66
+export DOCKERFILE TEST_IMAGE_NAMESPACE
... ...
@@ -9,25 +9,9 @@ images=(
9 9
 	hello-world:latest
10 10
 )
11 11
 
12
-imagePrefix=
13
-case "$DOCKER_ENGINE_OSARCH" in
14
-	linux/arm)
15
-		imagePrefix='armhf'
16
-		;;
17
-	linux/arm64)
18
-		imagePrefix='aarch64'
19
-		;;
20
-	linux/ppc64le)
21
-		imagePrefix='ppc64le'
22
-		;;
23
-	linux/s390x)
24
-		imagePrefix='s390x'
25
-		;;
26
-esac
27
-
28
-if [ "$imagePrefix" ]; then
12
+if [ "$TEST_IMAGE_NAMESPACE" ]; then
29 13
 	for (( i = 0; i < ${#images[@]}; i++ )); do
30
-		images[$i]="$imagePrefix/${images[$i]}"
14
+		images[$i]="$TEST_IMAGE_NAMESPACE/${images[$i]}"
31 15
 	done
32 16
 fi
33 17
 
... ...
@@ -58,7 +42,7 @@ if ! docker inspect "${images[@]}" &> /dev/null; then
58 58
 					inCont = 0;
59 59
 				}
60 60
 			}
61
-		' "${DOCKERFILE:=Dockerfile}" | sh -x
61
+		' "$DOCKERFILE" | sh -x
62 62
 		# Do not use a subshell for the following command. Windows to Linux CI
63 63
 		# runs bash 3.x so will not trap an error in a subshell.
64 64
 		# http://stackoverflow.com/questions/22630363/how-does-set-e-work-with-subshells
... ...
@@ -66,9 +50,9 @@ if ! docker inspect "${images[@]}" &> /dev/null; then
66 66
 	fi
67 67
 fi
68 68
 
69
-if [ "$imagePrefix" ]; then
69
+if [ "$TEST_IMAGE_NAMESPACE" ]; then
70 70
 	for image in "${images[@]}"; do
71
-		target="${image#$imagePrefix/}"
71
+		target="${image#$TEST_IMAGE_NAMESPACE/}"
72 72
 		if [ "$target" != "$image" ]; then
73 73
 			# tag images to ensure that all integrations work with the defined image names
74 74
 			docker tag "$image" "$target"