/
Dockerfile
125 lines (103 loc) · 3.61 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
# syntax=docker/dockerfile:1.2
ARG QEMU_VERSION
ARG QEMU_REPO=https://github.com/qemu/qemu
FROM --platform=$BUILDPLATFORM debian:buster AS src
RUN apt-get update && apt-get install -y git
ARG QEMU_VERSION
ARG QEMU_REPO
WORKDIR /src
RUN git clone $QEMU_REPO && \
cd qemu && \
git checkout $QEMU_VERSION && \
scripts/git-submodule.sh update \
ui/keycodemapdb \
tests/fp/berkeley-testfloat-3 \
tests/fp/berkeley-softfloat-3 \
dtc slirp
FROM --platform=$BUILDPLATFORM debian:buster AS qemu
RUN apt-get update && \
apt-get install -y \
dpkg-dev \
git \
ninja-build \
pkg-config \
python3 \
python3-setuptools
WORKDIR /qemu
ARG TARGETPLATFORM
ENV PATH=/qemu/install-scripts:$PATH
RUN --mount=target=./install-scripts,src=scripts \
TARGETPLATFORM=${TARGETPLATFORM} cross.sh install gcc libglib2.0-dev | sh
FROM qemu AS base-amd64
FROM qemu AS base-arm64
FROM qemu AS base-ppc64le
FROM qemu AS base-s390x
FROM qemu AS base-armv7
FROM qemu AS base-armv6
FROM qemu AS base-386
FROM qemu AS base-mips64le
FROM tonistiigi/debian:riscv AS riscv-libglibc
RUN apt-get update && apt-get install -y libglib2.0-dev
RUN for f in $(dpkg-query -L zlib1g-dev libglib2.0-dev libpcre3-dev libglib2.0-0 libpcre3); do [ ! -d $f ] && echo $f; done > /tmp/list
RUN mkdir -p /out && tar cvf /out/libglibc.tar -T /tmp/list
FROM tonistiigi/xx:riscv-toolchain AS base-riscv64
RUN apt-get update && \
apt-get install -y \
dpkg-dev \
git \
ninja-build \
pkg-config \
python3 \
python3-setuptools
ENV PATH=/qemu/install-scripts:$PATH
WORKDIR /qemu
RUN --mount=from=riscv-libglibc,target=/riscv-libglibc,src=out \
mkdir -p /tmp/out && tar xvf /riscv-libglibc/libglibc.tar -C /tmp/out && \
cp -a /tmp/out/usr/include/* /usr/riscv64-linux-gnu/include/ && \
cp -a /tmp/out/usr/lib/riscv64-linux-gnu/* /usr/riscv64-linux-gnu/lib/ && \
cp -a /tmp/out/usr/lib/* /usr/riscv64-linux-gnu/lib/ && \
ln -s /usr/riscv64-linux-gnu /usr/riscv64-buildroot-linux-gnu
ENV CROSS_PREFIX=riscv64-buildroot-linux-gnu
FROM base-$TARGETARCH$TARGETVARIANT AS base
FROM base AS build
ARG TARGETPLATFORM
ARG QEMU_VERSION
RUN --mount=target=.,from=src,src=/src/qemu,rw --mount=target=./install-scripts,src=scripts \
TARGETPLATFORM=${TARGETPLATFORM} configure_qemu.sh && \
make -j "$(getconf _NPROCESSORS_ONLN)" && \
make install
ARG BINARY_PREFIX
RUN cd /usr/bin; [ -z "$BINARY_PREFIX" ] || for f in $(ls qemu-*); do ln -s $f $BINARY_PREFIX$f; done
FROM build AS build-archive
RUN cd /usr/bin && mkdir -p /archive && \
tar czvfh "/archive/${BINARY_PREFIX}qemu_${QEMU_VERSION}_$(echo $TARGETPLATFORM | sed 's/\//-/g').tar.gz" ${BINARY_PREFIX}qemu*
FROM --platform=$BUILDPLATFORM tonistiigi/xx:golang@sha256:6f7d999551dd471b58f70716754290495690efa8421e0a1fcf18eb11d0c0a537 AS xgo
FROM --platform=$BUILDPLATFORM golang:1.16-alpine AS binfmt
COPY --from=xgo / /
ENV CGO_ENABLED=0
ARG TARGETPLATFORM
ARG QEMU_VERSION
WORKDIR /src
RUN apk add --no-cache git
RUN --mount=target=. \
TARGETPLATFORM=$TARGETPLATFORM go build \
-ldflags "-X main.revision=$(git rev-parse --short HEAD) -X main.qemuVersion=${QEMU_VERSION}" \
-o /go/bin/binfmt ./cmd/binfmt
FROM scratch AS binaries
ARG BINARY_PREFIX
COPY --from=build usr/bin/${BINARY_PREFIX}qemu-* /
FROM scratch AS archive
COPY --from=build-archive /archive/* /
FROM --platform=$BUILDPLATFORM tonistiigi/bats-assert AS assert
FROM golang:alpine AS buildkit-test
RUN apk add --no-cache bash bats
WORKDIR /work
COPY --from=assert . .
COPY test .
COPY --from=binaries / /usr/bin
RUN ./run.sh
FROM scratch
COPY --from=binaries / /usr/bin/
COPY --from=binfmt /go/bin/binfmt /usr/bin/binfmt
ENTRYPOINT [ "/usr/bin/binfmt" ]
VOLUME /tmp