mirror of
https://github.com/moby/moby.git
synced 2026-08-04 15:11:00 +00:00
Dockerfile: use TARGETPLATFORM to build Docker
Better support for cross compilation so we can fully rely
on `--platform` flag of buildx for a seamless integration.
This removes unnecessary extra cross logic in the Dockerfile,
DOCKER_CROSSPLATFORMS and CROSS vars and some hack scripts as well.
Non-sandboxed build invocation is still supported and dev stages
in the Dockerfile have been updated accordingly.
Bake definition and GitHub Actions workflows have been updated
accordingly as well.
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
(cherry picked from commit 8086f40123)
This commit is contained in:
@@ -16,56 +16,59 @@ source "${MAKEDIR}/.go-autogen"
|
||||
(
|
||||
export GOGC=${DOCKER_BUILD_GOGC:-1000}
|
||||
|
||||
if [ "$(go env GOOS)/$(go env GOARCH)" != "$(go env GOHOSTOS)/$(go env GOHOSTARCH)" ]; then
|
||||
# must be cross-compiling!
|
||||
case "$(go env GOOS)/$(go env GOARCH)" in
|
||||
windows/amd64)
|
||||
export CC="${CC:-x86_64-w64-mingw32-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/arm)
|
||||
case "${GOARM}" in
|
||||
5)
|
||||
export CC="${CC:-arm-linux-gnueabi-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
export CGO_CFLAGS="-march=armv5t"
|
||||
export CGO_CXXFLAGS="-march=armv5t"
|
||||
;;
|
||||
6)
|
||||
export CC="${CC:-arm-linux-gnueabi-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
export CGO_CFLAGS="-march=armv6"
|
||||
export CGO_CXXFLAGS="-march=armv6"
|
||||
;;
|
||||
7)
|
||||
export CC="${CC:-arm-linux-gnueabihf-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
export CGO_CFLAGS="-march=armv7-a"
|
||||
export CGO_CXXFLAGS="-march=armv7-a"
|
||||
;;
|
||||
*)
|
||||
export CC="${CC:-arm-linux-gnueabihf-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
linux/arm64)
|
||||
export CC="${CC:-aarch64-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/amd64)
|
||||
export CC="${CC:-x86_64-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/ppc64le)
|
||||
export CC="${CC:-powerpc64le-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/s390x)
|
||||
export CC="${CC:-s390x-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
esac
|
||||
# for non-sandboxed invocation
|
||||
if ! command -v xx-go > /dev/null 2>&1; then
|
||||
if [ "$(go env GOOS)/$(go env GOARCH)" != "$(go env GOHOSTOS)/$(go env GOHOSTARCH)" ]; then
|
||||
# must be cross-compiling!
|
||||
case "$(go env GOOS)/$(go env GOARCH)" in
|
||||
windows/amd64)
|
||||
export CC="${CC:-x86_64-w64-mingw32-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/arm)
|
||||
case "${GOARM}" in
|
||||
5)
|
||||
export CC="${CC:-arm-linux-gnueabi-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
export CGO_CFLAGS="-march=armv5t"
|
||||
export CGO_CXXFLAGS="-march=armv5t"
|
||||
;;
|
||||
6)
|
||||
export CC="${CC:-arm-linux-gnueabi-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
export CGO_CFLAGS="-march=armv6"
|
||||
export CGO_CXXFLAGS="-march=armv6"
|
||||
;;
|
||||
7)
|
||||
export CC="${CC:-arm-linux-gnueabihf-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
export CGO_CFLAGS="-march=armv7-a"
|
||||
export CGO_CXXFLAGS="-march=armv7-a"
|
||||
;;
|
||||
*)
|
||||
export CC="${CC:-arm-linux-gnueabihf-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
linux/arm64)
|
||||
export CC="${CC:-aarch64-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/amd64)
|
||||
export CC="${CC:-x86_64-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/ppc64le)
|
||||
export CC="${CC:-powerpc64le-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
linux/s390x)
|
||||
export CC="${CC:-s390x-linux-gnu-gcc}"
|
||||
export CGO_ENABLED=1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
||||
# -buildmode=pie is not supported on Windows and Linux on mips, riscv64 and ppc64be.
|
||||
@@ -80,8 +83,18 @@ source "${MAKEDIR}/.go-autogen"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Building: $DEST/$BINARY_FULLNAME"
|
||||
echo "GOOS=\"${GOOS}\" GOARCH=\"${GOARCH}\" GOARM=\"${GOARM}\""
|
||||
# only necessary for non-sandboxed invocation where TARGETPLATFORM is empty
|
||||
PLATFORM_NAME=$TARGETPLATFORM
|
||||
if [ -z "$PLATFORM_NAME" ]; then
|
||||
PLATFORM_NAME="$(go env GOOS)/$(go env GOARCH)"
|
||||
if [ -n "$(go env GOARM)" ]; then
|
||||
PLATFORM_NAME+="/$(go env GOARM)"
|
||||
elif [ -n "$(go env GOAMD64)" ] && [ "$(go env GOAMD64)" != "v1" ]; then
|
||||
PLATFORM_NAME+="/$(go env GOAMD64)"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Building $DEST/$BINARY_FULLNAME ($PLATFORM_NAME)..."
|
||||
go build \
|
||||
-o "$DEST/$BINARY_FULLNAME" \
|
||||
"${BUILDFLAGS[@]}" \
|
||||
|
||||
@@ -1,35 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
copy_binaries() {
|
||||
local dir="$1"
|
||||
|
||||
# Add nested executables to bundle dir so we have complete set of
|
||||
# them available, but only if the native OS/ARCH is the same as the
|
||||
# OS/ARCH of the build target
|
||||
if [ "$(go env GOOS)/$(go env GOARCH)" != "$(go env GOHOSTOS)/$(go env GOHOSTARCH)" ]; then
|
||||
return
|
||||
fi
|
||||
if [ ! -x /usr/local/bin/runc ]; then
|
||||
return
|
||||
fi
|
||||
echo "Copying nested executables into $dir"
|
||||
for file in containerd containerd-shim-runc-v2 ctr runc docker-init rootlesskit rootlesskit-docker-proxy dockerd-rootless.sh dockerd-rootless-setuptool.sh; do
|
||||
cp -f "$(command -v "$file")" "$dir/"
|
||||
done
|
||||
# vpnkit might not be available for the target platform, see vpnkit stage in
|
||||
# the Dockerfile for more information.
|
||||
if command -v vpnkit > /dev/null 2>&1; then
|
||||
cp -f "$(command -v vpnkit)" "$dir/"
|
||||
fi
|
||||
}
|
||||
|
||||
[ -z "$KEEPDEST" ] && rm -rf "$DEST"
|
||||
|
||||
(
|
||||
GO_PACKAGE='github.com/docker/docker/cmd/dockerd'
|
||||
BINARY_NAME='dockerd'
|
||||
|
||||
source "${MAKEDIR}/.binary"
|
||||
copy_binaries "$DEST"
|
||||
)
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# if we have our linux/amd64 version compiled, let's symlink it in
|
||||
if [ -x "${DEST}/../binary-daemon/dockerd" ]; then
|
||||
arch=$(go env GOHOSTARCH)
|
||||
mkdir -p "$DEST/linux/${arch}"
|
||||
(
|
||||
cd "${DEST}/linux/${arch}"
|
||||
ln -sf ../../../binary-daemon/* ./
|
||||
)
|
||||
echo "Created symlinks:" "${DEST}/linux/${arch}/"*
|
||||
fi
|
||||
|
||||
DOCKER_CROSSPLATFORMS=${DOCKER_CROSSPLATFORMS:-"linux/amd64 windows/amd64 linux/ppc64le linux/s390x"}
|
||||
|
||||
for platform in ${DOCKER_CROSSPLATFORMS}; do
|
||||
(
|
||||
export KEEPDEST=1
|
||||
export DEST="${DEST}/${platform}" # bundles/VERSION/cross/GOOS/GOARCH/docker-VERSION
|
||||
export GOOS=${platform%%/*}
|
||||
export GOARCH=${platform#*/}
|
||||
|
||||
if [[ "${GOARCH}" = "arm/"* ]]; then
|
||||
GOARM=${GOARCH##*/v}
|
||||
GOARCH=${GOARCH%/v*}
|
||||
export GOARM
|
||||
fi
|
||||
|
||||
echo "Cross building: ${DEST}"
|
||||
mkdir -p "${DEST}"
|
||||
ABS_DEST="$(cd "${DEST}" && pwd -P)"
|
||||
source "${MAKEDIR}/binary"
|
||||
|
||||
source "${MAKEDIR}/cross-platform-dependent"
|
||||
)
|
||||
done
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
if [ ${platform} == "windows/amd64" ]; then
|
||||
source "${MAKEDIR}/containerutility"
|
||||
fi
|
||||
Reference in New Issue
Block a user