-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Dockerfile
256 lines (215 loc) · 8.26 KB
/
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# syntax=docker/dockerfile:1
ARG ALPINE_VERSION="latest"
ARG XX_VERSION="1.4.0"
ARG S6_OVERLAY_VERSION="3.1.5.0"
ARG S6_OVERLAY_REF="9eda003e19a6e01edd951ad84dd50a4804129d73"
# https://bearssl.org/gitweb/?p=BearSSL;a=commit;h=46f7dddce75227f2e40ab94d66ceb9f19ee6b1b0
ARG BEARSSL_VERSION="0.6"
ARG BEARSSL_REF="46f7dddce75227f2e40ab94d66ceb9f19ee6b1b0"
ARG SKALIBS_VERSION="2.13.1.1"
ARG EXECLINE_VERSION="2.9.3.0"
ARG S6_VERSION="2.11.3.2"
ARG S6_RC_VERSION="0.5.4.1"
ARG S6_LINUX_INIT_VERSION="1.1.1.1"
ARG S6_PORTABLE_UTILS_VERSION="2.3.0.2"
ARG S6_LINUX_UTILS_VERSION="2.6.1.2"
ARG S6_DNS_VERSION="2.3.5.5"
ARG S6_NETWORKING_VERSION="2.5.1.3"
ARG S6_OVERLAY_HELPERS_VERSION="0.1.0.1"
FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx
FROM --platform=$BUILDPLATFORM alpine:${ALPINE_VERSION} AS alpine
FROM alpine AS src
RUN apk --update --no-cache add curl git patch tar
WORKDIR /src
FROM src AS src-s6overlay
ARG S6_OVERLAY_VERSION
ARG S6_OVERLAY_REF
RUN <<EOT
set -e
git clone https://github.com/just-containers/s6-overlay.git .
git reset --hard $S6_OVERLAY_REF
EOT
FROM src AS src-bearssl
ARG BEARSSL_VERSION
ARG BEARSSL_REF
RUN <<EOT
set -e
git clone https://www.bearssl.org/git/BearSSL .
git reset --hard $BEARSSL_REF
EOT
FROM src AS src-skalibs
ARG SKALIBS_VERSION
RUN curl -sSL "https://skarnet.org/software/skalibs/skalibs-${SKALIBS_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-execline
ARG EXECLINE_VERSION
RUN curl -sSL "https://skarnet.org/software/execline/execline-${EXECLINE_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6
ARG S6_VERSION
RUN curl -sSL "https://skarnet.org/software/s6/s6-${S6_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6rc
ARG S6_RC_VERSION
RUN curl -sSL "https://skarnet.org/software/s6-rc/s6-rc-${S6_RC_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6linuxinit
ARG S6_LINUX_INIT_VERSION
RUN curl -sSL "https://skarnet.org/software/s6-linux-init/s6-linux-init-${S6_LINUX_INIT_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6portableutils
ARG S6_PORTABLE_UTILS_VERSION
RUN curl -sSL "https://skarnet.org/software/s6-portable-utils/s6-portable-utils-${S6_PORTABLE_UTILS_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6linuxutils
ARG S6_LINUX_UTILS_VERSION
RUN curl -sSL "https://skarnet.org/software/s6-linux-utils/s6-linux-utils-${S6_LINUX_UTILS_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6dns
ARG S6_DNS_VERSION
RUN curl -sSL "https://skarnet.org/software/s6-dns/s6-dns-${S6_DNS_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6networking
ARG S6_NETWORKING_VERSION
RUN curl -sSL "https://skarnet.org/software/s6-networking/s6-networking-${S6_NETWORKING_VERSION}.tar.gz" | tar xz --strip 1
FROM src AS src-s6overlayhelpers
ARG S6_OVERLAY_HELPERS_VERSION
RUN <<EOT
set -e
git clone https://github.com/just-containers/s6-overlay-helpers.git .
git reset --hard v$S6_OVERLAY_HELPERS_VERSION
EOT
FROM alpine AS base
RUN apk --update --no-cache add bash clang curl git llvm make tar tree xz
COPY --from=xx / /
FROM base AS build
ARG TARGETPLATFORM
RUN xx-apk add musl-dev gcc g++ linux-headers
ENV XX_CC_PREFER_LINKER=ld
WORKDIR /usr/local/src/skalibs
COPY --from=src-skalibs /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared --with-default-path=/command:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --with-sysdep-devurandom=yes
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/execline
COPY --from=src-execline /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared --disable-pedantic-posix
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/s6
COPY --from=src-s6 /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/s6rc
COPY --from=src-s6rc /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/s6linuxinit
COPY --from=src-s6linuxinit /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/s6portableutils
COPY --from=src-s6portableutils /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/s6linuxutils
COPY --from=src-s6linuxutils /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/s6dns
COPY --from=src-s6dns /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
# https://bearssl.org/gitweb/?p=BearSSL;a=blob;f=conf/Unix.mk;h=02f2b2be8ee48d1645b478fc02e53acede3c5102;hb=refs/heads/master
WORKDIR /usr/local/src/bearssl
COPY --from=src-bearssl /src .
RUN <<EOT
set -ex
mkdir -p /out/include
cp -a ./inc/*.h /out/include/
make lib CC=xx-clang AR=$(xx-info)-ar LDDLL=xx-clang LD=xx-clang
mkdir -p /out/lib
cp -f build/libbearssl.a /out/lib/
EOT
WORKDIR /usr/local/src/s6networking
COPY --from=src-s6networking /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared --enable-ssl=bearssl --with-ssl-path=/out
make -j$(nproc)
make DESTDIR=/out -L install update global-links -j$(nproc)
EOT
WORKDIR /usr/local/src/s6overlayhelpers
COPY --from=src-s6overlayhelpers /src .
RUN <<EOT
set -ex
DESTDIR=/out ./configure --host=$(xx-clang --print-target-triple) --enable-slashpackage --enable-static-libc --disable-shared
make
make DESTDIR=/out -L install update global-links
EOT
WORKDIR /usr/local/src/s6overlay
ARG S6_OVERLAY_VERSION
COPY --from=src-s6overlay /src .
RUN <<EOT
set -ex
# cleanup
rm -rf /out/package/*/*/include /out/package/*/*/library
# s6-overlay
find ./layout/rootfs-overlay -type f -name .empty -print | xargs rm -f --
find ./layout/rootfs-overlay -name '*@VERSION@*' -print | while read name; do
mv -f "$name" $(echo "$name" | sed -e "s/@VERSION@/$S6_OVERLAY_VERSION/")
done
find ./layout/rootfs-overlay -type f -size +0c -print | xargs sed -i -e "s|@SHEBANGDIR@|/command|g; s/@VERSION@/$S6_OVERLAY_VERSION/g;" --
(cd /out/package/admin/ ; ln -s s6-overlay-$S6_OVERLAY_VERSION s6-overlay)
cp -rf ./layout/rootfs-overlay/* /out/
# s6-syslogd-overlay
find ./layout/syslogd-overlay -type f -name .empty -print | xargs rm -f --
find ./layout/syslogd-overlay -name '*@VERSION@*' -print | while read name; do
mv -f "$name" $(echo "$name" | sed -e "s/@VERSION@/$S6_OVERLAY_VERSION/")
done
find ./layout/syslogd-overlay -type f -size +0c -print | xargs sed -i -e "s|@SHEBANGDIR@|/command|g; s/@VERSION@/$S6_OVERLAY_VERSION/g;" --
cp -rf ./layout/syslogd-overlay/* /out/
# symlinks
mkdir -p /out/usr/bin
for i in $(ls -1 /out/command); do
ln -s "../../command/$i" /out/usr/bin/
done
EOT
FROM base AS tgz
COPY --from=build /out /build
ARG S6_OVERLAY_VERSION
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT
WORKDIR /build
RUN mkdir -p /artifact && tar -zcvf /artifact/s6-overlay_${S6_OVERLAY_VERSION}_${TARGETOS}_${TARGETARCH}${TARGETVARIANT}.tar.gz .
FROM scratch AS artifact
COPY --from=tgz /artifact /
FROM scratch AS dist
COPY --from=build /out /
FROM alpine:${ALPINE_VERSION}
COPY --from=build /out /
RUN s6-rmrf /tmp/* && s6-ps
ENTRYPOINT ["/init"]