Skip to content

Commit 0412ceb

Browse files
committed
Fix alpine-docker build in different arch issue
1 parent f3f581f commit 0412ceb

File tree

1 file changed

+42
-19
lines changed

1 file changed

+42
-19
lines changed

bin/spc-alpine-docker

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
#!/usr/bin/env sh
1+
#!/usr/bin/env bash
2+
3+
set -e
24

35
# This file is using docker to run commands
4-
SPC_DOCKER_VERSION=v3
6+
SPC_DOCKER_VERSION=v4
57

68
# Detect docker can run
79
if ! which docker >/dev/null; then
8-
echo "Docker is not installed, please install docker first !"
9-
exit 1
10+
echo "Docker is not installed, please install docker first !"
11+
exit 1
1012
fi
1113
DOCKER_EXECUTABLE="docker"
1214
# shellcheck disable=SC2046
@@ -22,27 +24,48 @@ if [ $(id -u) -ne 0 ]; then
2224
fi
2325
fi
2426

25-
26-
27-
# to check if qemu-docker run
28-
if [ "$SPC_USE_ARCH" = "" ]; then
29-
SPC_USE_ARCH=x86_64
27+
# Convert uname to gnu arch
28+
CURRENT_ARCH=$(uname -m)
29+
if [ "$CURRENT_ARCH" = "arm64" ]; then
30+
CURRENT_ARCH=aarch64
31+
fi
32+
if [ -z "$SPC_USE_ARCH" ]; then
33+
SPC_USE_ARCH=$CURRENT_ARCH
3034
fi
35+
# parse SPC_USE_ARCH
3136
case $SPC_USE_ARCH in
32-
x86_64)
33-
ALPINE_FROM=alpine:edge
37+
x86_64|amd64)
38+
SPC_USE_ARCH=x86_64
39+
if [ "$CURRENT_ARCH" != "x86_64" ]; then
40+
PLATFORM_ARG="--platform linux/amd64"
41+
ALPINE_FROM=multiarch/alpine:x86_64-edge
42+
fi
3443
;;
35-
aarch64)
36-
ALPINE_FROM=multiarch/alpine:aarch64-edge
37-
# shellcheck disable=SC2039
38-
echo -e "\e[033m* Using different arch needs to setup qemu-static for docker !\e[0m"
39-
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static:register --reset > /dev/null
44+
aarch64|arm64)
45+
SPC_USE_ARCH=aarch64
46+
if [ "$CURRENT_ARCH" != "aarch64" ]; then
47+
PLATFORM_ARG="--platform linux/arm64"
48+
ALPINE_FROM=multiarch/alpine:aarch64-edge
49+
fi
4050
;;
4151
*)
4252
echo "Current arch is not supported to run in docker: $SPC_USE_ARCH"
4353
exit 1
4454
;;
4555
esac
56+
# if ALPINE_FROM is not set, use alpine:edge
57+
if [ -z "$ALPINE_FROM" ]; then
58+
ALPINE_FROM=alpine:edge
59+
fi
60+
if [ "$SPC_USE_ARCH" != "$CURRENT_ARCH" ]; then
61+
echo "* Using different arch needs to setup qemu-static for docker !"
62+
ALPINE_FROM=multiarch/alpine:$SPC_USE_ARCH-edge
63+
if [ "$(uname -s)" = "Linux" ]; then
64+
$DOCKER_EXECUTABLE run --rm --privileged multiarch/qemu-user-static:register --reset > /dev/null
65+
fi
66+
else
67+
ALPINE_FROM=alpine:edge
68+
fi
4669

4770
if [ "$SPC_USE_MIRROR" = "yes" ]; then
4871
SPC_USE_MIRROR="RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories"
@@ -53,7 +76,7 @@ fi
5376
# Detect docker env is setup
5477
if ! $DOCKER_EXECUTABLE images | grep -q cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION; then
5578
echo "Docker container does not exist. Building docker image ..."
56-
$DOCKER_EXECUTABLE build -t cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION -f- . <<EOF
79+
$DOCKER_EXECUTABLE build $PLATFORM_ARG -t cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION -f- . <<EOF
5780
FROM $ALPINE_FROM
5881
$SPC_USE_MIRROR
5982
RUN apk update; \
@@ -148,7 +171,7 @@ if [ "$SPC_DOCKER_DEBUG" = "yes" ]; then
148171
echo "* ./pkgroot: $(pwd)/pkgroot"
149172
echo "*"
150173
set -ex
151-
$DOCKER_EXECUTABLE run --rm $INTERACT $ENV_LIST $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION
174+
$DOCKER_EXECUTABLE run $PLATFORM_ARG --rm $INTERACT $ENV_LIST $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION /bin/bash
152175
else
153-
$DOCKER_EXECUTABLE run --rm $INTERACT $ENV_LIST $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION bin/spc $@
176+
$DOCKER_EXECUTABLE run $PLATFORM_ARG --rm $INTERACT $ENV_LIST $MOUNT_LIST cwcc-spc-$SPC_USE_ARCH-$SPC_DOCKER_VERSION bin/spc $@
154177
fi

0 commit comments

Comments
 (0)