Skip to content

Commit 5ab2b8a

Browse files
authored
Build: use multi-stage to support new version and multi platform (#74)
1 parent f7fa1b7 commit 5ab2b8a

File tree

10 files changed

+233
-19
lines changed

10 files changed

+233
-19
lines changed

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.git
2+
Dockerfile

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*.rsa
2+
*.pkg*
3+
*.gz
4+
src
5+
pkg
6+
packages

APKBUILD

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Maintainer: Sasha Gerrand <[email protected]>
2+
3+
pkgname="glibc"
4+
pkgver="2.39"
5+
pkgrel="1"
6+
pkgdesc="GNU C Library compatibility layer"
7+
arch="aarch64"
8+
url="https://github.com/sgerrand/alpine-pkg-glibc"
9+
license="LGPL"
10+
source="./glibc-bin-$pkgver.tar.gz
11+
ld.so.conf"
12+
subpackages="$pkgname-bin $pkgname-dev $pkgname-i18n"
13+
triggers="$pkgname-bin.trigger=/lib:/usr/lib:/usr/glibc-compat/lib"
14+
15+
package() {
16+
mkdir -p "$pkgdir/lib" "$pkgdir/usr/glibc-compat/lib/locale" "$pkgdir"/usr/glibc-compat/lib64 "$pkgdir"/etc
17+
cp -a "$srcdir"/usr "$pkgdir"
18+
cp "$srcdir"/ld.so.conf "$pkgdir"/usr/glibc-compat/etc/ld.so.conf
19+
rm "$pkgdir"/usr/glibc-compat/etc/rpc
20+
rm -rf "$pkgdir"/usr/glibc-compat/bin
21+
rm -rf "$pkgdir"/usr/glibc-compat/sbin
22+
rm -rf "$pkgdir"/usr/glibc-compat/lib/gconv
23+
rm -rf "$pkgdir"/usr/glibc-compat/lib/getconf
24+
rm -rf "$pkgdir"/usr/glibc-compat/lib/audit
25+
rm -rf "$pkgdir"/usr/glibc-compat/share
26+
rm -rf "$pkgdir"/usr/glibc-compat/var
27+
28+
# set up symbolic links based on architecture
29+
case "$arch" in
30+
x86_64)
31+
ln -s /usr/glibc-compat/lib/ld-linux-x86_64.so.2 ${pkgdir}/lib/ld-linux-x86_64.so.2
32+
ln -s /usr/glibc-compat/lib/ld-linux-x86_64.so.2 ${pkgdir}/usr/glibc-compat/lib64/ld-linux-x86_64.so.2
33+
;;
34+
aarch64)
35+
ln -s /usr/glibc-compat/lib/ld-linux-aarch64.so.1 ${pkgdir}/lib/ld-linux-aarch64.so.1
36+
ln -s /usr/glibc-compat/lib/ld-linux-aarch64.so.1 ${pkgdir}/usr/glibc-compat/lib64/ld-linux-aarch64.so.1
37+
;;
38+
*)
39+
echo "not support: $arch"
40+
exit 1
41+
;;
42+
esac
43+
44+
ln -s /usr/glibc-compat/etc/ld.so.cache ${pkgdir}/etc/ld.so.cache
45+
}
46+
47+
bin() {
48+
depends="$pkgname bash libc6-compat libgcc"
49+
mkdir -p "$subpkgdir"/usr/glibc-compat
50+
cp -a "$srcdir"/usr/glibc-compat/bin "$subpkgdir"/usr/glibc-compat
51+
cp -a "$srcdir"/usr/glibc-compat/sbin "$subpkgdir"/usr/glibc-compat
52+
}
53+
54+
i18n() {
55+
depends="$pkgname-bin"
56+
arch="noarch"
57+
mkdir -p "$subpkgdir"/usr/glibc-compat
58+
cp -a "$srcdir"/usr/glibc-compat/share "$subpkgdir"/usr/glibc-compat
59+
}

Dockerfile

Lines changed: 95 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM alpine:3.20
1+
FROM alpine:3.20 AS remote-builder
22

33
ENV LANG=C.UTF-8
44

@@ -10,24 +10,24 @@ RUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases
1010
ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
1111
apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \
1212
echo \
13-
"-----BEGIN PUBLIC KEY-----\
14-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\
15-
y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\
16-
tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\
17-
m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\
18-
KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\
19-
Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\
20-
1QIDAQAB\
21-
-----END PUBLIC KEY-----" | sed 's/ */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \
13+
"-----BEGIN PUBLIC KEY-----\
14+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\
15+
y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\
16+
tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\
17+
m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\
18+
KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\
19+
Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\
20+
1QIDAQAB\
21+
-----END PUBLIC KEY-----" | sed 's/ */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \
2222
wget \
23-
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
24-
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
25-
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
23+
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
24+
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
25+
"$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
2626
mv /etc/nsswitch.conf /etc/nsswitch.conf.bak && \
2727
apk add --no-cache --force-overwrite \
28-
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
29-
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
30-
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
28+
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
29+
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
30+
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
3131
\
3232
mv /etc/nsswitch.conf.bak /etc/nsswitch.conf && \
3333
rm "/etc/apk/keys/sgerrand.rsa.pub" && \
@@ -39,6 +39,82 @@ RUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases
3939
rm "/root/.wget-hsts" && \
4040
apk del .build-dependencies && \
4141
rm \
42-
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
43-
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
44-
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"
42+
"$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
43+
"$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
44+
"$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"
45+
46+
47+
# Stage 1: use docker-glibc-builder build glibc.tar.gz
48+
FROM ubuntu:22.04 AS builder
49+
LABEL maintainer="Sasha Gerrand <[email protected]>"
50+
ARG GLIBC_VERSION=2.39
51+
ENV DEBIAN_FRONTEND=noninteractive \
52+
GLIBC_VERSION=${GLIBC_VERSION} \
53+
PREFIX_DIR=/usr/glibc-compat
54+
RUN apt-get -q update \
55+
&& apt-get -qy install \
56+
bison \
57+
build-essential \
58+
gawk \
59+
gettext \
60+
openssl \
61+
python3 \
62+
texinfo \
63+
wget
64+
COPY configparams /glibc-build/configparams
65+
COPY builder /builder
66+
RUN /builder
67+
68+
# Stage 2: use docker-alpine-abuild package apk and keys
69+
FROM alpine:3.20 AS packager
70+
ARG GLIBC_VERSION=2.39
71+
ARG ALPINE_VERSION=3.20
72+
ARG TARGETARCH
73+
RUN apk --no-cache add alpine-sdk coreutils cmake sudo bash \
74+
&& adduser -G abuild -g "Alpine Package Builder" -s /bin/ash -D builder \
75+
&& echo "builder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
76+
&& mkdir /packages \
77+
&& chown builder:abuild /packages
78+
COPY ./abuilder /bin/
79+
USER builder
80+
ENV PACKAGER="[email protected]"
81+
RUN abuild-keygen -na && sudo cp /home/builder/.abuild/${PACKAGER}-*.rsa.pub /etc/apk/keys/
82+
WORKDIR /home/builder/package
83+
COPY --from=builder /glibc-bin-${GLIBC_VERSION}.tar.gz /home/builder/package/
84+
COPY . /home/builder/package/
85+
86+
ENV REPODEST=/packages
87+
RUN case "$TARGETARCH" in \
88+
amd64) export TARGET_ARCH="x86_64" ;; \
89+
arm64) export TARGET_ARCH="aarch64" ;; \
90+
*) echo "Unsupported architecture: $TARGETARCH" && exit 1 ;; \
91+
esac && \
92+
sed -i "s/^pkgver=.*/pkgver=${GLIBC_VERSION}/" APKBUILD && \
93+
sed -i "s/^arch=.*$/arch=\"${TARGET_ARCH}\"/" APKBUILD && \
94+
abuild checksum && abuilder -r && cp /packages/builder/${TARGET_ARCH}/*.apk /tmp/
95+
96+
# Stage 3: apk add apk, build alpine-glibc
97+
FROM alpine:3.20
98+
ARG GLIBC_VERSION=2.39
99+
ARG TARGETARCH
100+
ENV GLIBC_VERSION=${GLIBC_VERSION}
101+
ENV PACKAGER="[email protected]"
102+
103+
RUN case "$TARGETARCH" in \
104+
amd64) export LD_LINUX_PATH="/lib/ld-linux-x86_64.so.2" ;; \
105+
arm64) export LD_LINUX_PATH="/lib/ld-linux-aarch64.so.1" ;; \
106+
*) echo "Unsupported architecture: $TARGETARCH" && exit 1 ;; \
107+
esac
108+
109+
# use the key used during the build process
110+
COPY --from=packager /tmp/*.apk /tmp/
111+
COPY --from=packager /home/builder/.abuild/${PACKAGER}-*.pub /etc/apk/keys/
112+
113+
# install glibc APK
114+
RUN apk add --no-cache gcompat && rm -rf ${LD_LINUX_PATH} && \
115+
apk add --no-cache --force-overwrite /tmp/glibc-${GLIBC_VERSION}-*.apk && \
116+
apk add --no-cache /tmp/glibc-bin-${GLIBC_VERSION}-*.apk && \
117+
apk add --no-cache /tmp/glibc-i18n-${GLIBC_VERSION}-*.apk && \
118+
rm -rf /tmp/*.apk
119+
120+
CMD ["/bin/sh"]

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ Download size of this image is only:
1919

2020
[![](https://images.microbadger.com/badges/image/frolvlad/alpine-glibc.svg)](http://microbadger.com/images/frolvlad/alpine-glibc "Get your own image badge on microbadger.com")
2121

22+
Builder
23+
-------------
24+
25+
```Shell
26+
docker buildx build --platform linux/arm64,linux/amd64 --build-arg GLIBC_VERSION=2.39 -t alpine-glibc:2.39 .
27+
```
2228

2329
Usage Example
2430
-------------

abuilder

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#!/usr/bin/env ash
2+
3+
set -e
4+
5+
main() {
6+
RSA_FILE=$(ls /home/builder/.abuild/${PACKAGER}-*.rsa | head -n 1)
7+
export PACKAGER_PRIVKEY="$RSA_FILE"
8+
9+
mkdir -p "$REPODEST" /home/builder/.abuild
10+
abuild-apk update
11+
[ "$RSA_PRIVATE_KEY" ] && {
12+
echo -e "$RSA_PRIVATE_KEY" >"/home/builder/.abuild/$RSA_PRIVATE_KEY_NAME"
13+
export PACKAGER_PRIVKEY="/home/builder/.abuild/$RSA_PRIVATE_KEY_NAME"
14+
}
15+
ls -lh /home/builder/.abuild
16+
echo "PACKAGE_PRIVKEY ${PACKAGER_PRIVKEY}"
17+
sudo chown -R builder:abuild /home/builder/package
18+
sudo chown -R builder:abuild $REPODEST
19+
20+
# exec abuild -r clean
21+
exec abuild "$@"
22+
}
23+
24+
main "$@"

builder

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env bash
2+
3+
set -eo pipefail
4+
[[ "$TRACE" ]] && set -x
5+
6+
main() {
7+
declare version="${1:-$GLIBC_VERSION}" prefix="${2:-$PREFIX_DIR}"
8+
9+
: "${version:?}" "${prefix:?}"
10+
11+
{
12+
wget -qO- "https://ftpmirror.gnu.org/libc/glibc-$version.tar.gz" |
13+
tar zxf -
14+
mkdir -p /glibc-build && cd /glibc-build
15+
"/glibc-$version/configure" \
16+
--prefix="$prefix" \
17+
--libdir="$prefix/lib" \
18+
--libexecdir="$prefix/lib" \
19+
--enable-multi-arch \
20+
--enable-stack-protector=strong
21+
make --jobs=4 && make install
22+
tar --dereference --hard-dereference -zcf "/glibc-bin-$version.tar.gz" "$prefix"
23+
} >&2
24+
25+
# [[ $STDOUT ]] && cat "/glibc-bin-$version.tar.gz"
26+
}
27+
28+
main "$@"

configparams

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
slibdir=/usr/glibc-compat/lib
2+
rtlddir=/usr/glibc-compat/lib
3+
sbindir=/usr/glibc-compat/bin
4+
rootsbindir=/usr/glibc-compat/bin
5+
build-programs=yes

glibc-bin.trigger

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/sh
2+
/usr/glibc-compat/sbin/ldconfig

ld.so.conf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# libc default configuration
2+
/usr/local/lib
3+
4+
/usr/glibc-compat/lib
5+
/usr/lib
6+
/lib

0 commit comments

Comments
 (0)