1+ ARG BASE_VERSION=1.24-alpine3.23
2+ FROM golang:${BASE_VERSION} AS init-env
3+
4+ RUN apk add --update --no-cache curl make git libc-dev bash gcc linux-headers eudev-dev ncurses-dev
5+
6+ ARG TARGETARCH
7+ ARG BUILDARCH
8+ ARG GITHUB_ORGANIZATION
9+ ARG REPO_HOST
10+ ARG GITHUB_REPO
11+ ARG WASMVM_VERSION
12+
13+ WORKDIR /go/src/${REPO_HOST}/${GITHUB_ORGANIZATION}/${GITHUB_REPO}
14+
15+ # Download CosmWasm libwasmvm if found
16+ RUN set -eux; \
17+ export ARCH=$(uname -m); \
18+ if [ ! -z "${WASMVM_VERSION}" ]; then\
19+ WASMVM_REPO=$(echo $WASMVM_VERSION | awk '{print $1}' );\
20+ WASMVM_VERS=$(echo $WASMVM_VERSION | awk '{print $2}' );\
21+ wget -O /lib/libwasmvm_muslc.a https://${WASMVM_REPO}/releases/download/${WASMVM_VERS}/libwasmvm_muslc.$(uname -m).a;\
22+ ln /lib/libwasmvm_muslc.a /lib/libwasmvm_muslc.$(uname -m).a;\
23+ fi;
24+
25+ ARG BUILD_DIR
26+
27+ ADD ${BUILD_DIR}/go.mod ${BUILD_DIR}/go.sum ./
28+
29+ ARG CLONE_KEY
30+
31+ RUN if [ ! -z "${CLONE_KEY}" ]; then\
32+ mkdir -p ~/.ssh;\
33+ echo "${CLONE_KEY}" | base64 -d > ~/.ssh/id_ed25519;\
34+ chmod 600 ~/.ssh/id_ed25519;\
35+ apk add openssh;\
36+ git config --global --add url."ssh://git@github.com/" .insteadOf "https://github.com/" ;\
37+ ssh-keyscan github.com >> ~/.ssh/known_hosts;\
38+ fi
39+
40+ ARG VENDOR
41+
42+ # Download go mod dependencies
43+ RUN set -eux; \
44+ if [[ "${BUILD_DIR}" == "." && "${VENDOR}" == "false" ]]; then\
45+ go mod download;\
46+ fi;
47+
48+ # Use minimal busybox from infra-toolkit image
49+ FROM ghcr.io/strangelove-ventures/infra-toolkit:v0.1.12 AS infra-toolkit
50+ RUN addgroup --gid 1025 -S heighliner && adduser --uid 1025 -S heighliner -G heighliner
51+
52+ # Use alpine to source CA certificates
53+ FROM alpine:3 as alpine-3
54+
55+ # Build binary from local source
56+ FROM init-env AS build-env
57+
58+ ARG BUILD_TARGET
59+ ARG BUILD_ENV
60+ ARG BUILD_TAGS
61+ ARG PRE_BUILD
62+ ARG BUILD_DIR
63+
64+ ADD . .
65+
66+ RUN set -eux; \
67+ export CGO_ENABLED=1 LDFLAGS='-linkmode external -extldflags "-static"' ; \
68+ if [ ! -z "$PRE_BUILD" ]; then sh -c "${PRE_BUILD}" ; fi; \
69+ if [ ! -z "$BUILD_TARGET" ]; then \
70+ if [ ! -z "$BUILD_ENV" ]; then export ${BUILD_ENV}; fi; \
71+ if [ ! -z "$BUILD_TAGS" ]; then export "${BUILD_TAGS}" ; fi; \
72+ if [ ! -z "$BUILD_DIR" ]; then cd "${BUILD_DIR}" ; fi; \
73+ sh -c "${BUILD_TARGET}" ; \
74+ fi
75+
76+ # Collect binaries
77+ RUN mkdir /root/bin
78+ ARG RACE
79+ ARG BINARIES
80+ ENV BINARIES_ENV ${BINARIES}
81+
82+ RUN bash -c 'set -eux;\
83+ BINARIES_ARR=();\
84+ IFS=, read -ra BINARIES_ARR <<< "$BINARIES_ENV";\
85+ for BINARY in "${BINARIES_ARR[@]}"; do\
86+ BINSPLIT=();\
87+ IFS=: read -ra BINSPLIT <<< "$BINARY";\
88+ BINPATH=${BINSPLIT[1]+"${BINSPLIT[1]}"};\
89+ BIN="$(eval "echo "${BINSPLIT[0]+"${BINSPLIT[0]}"}"")";\
90+ if [ ! -z "$RACE" ] && GOVERSIONOUT=$(go version -m $BIN); then\
91+ if echo $GOVERSIONOUT | grep build | grep "-race=true"; then\
92+ echo "Race detection is enabled in binary";\
93+ else\
94+ echo "Race detection not enabled in binary!";\
95+ exit 1;\
96+ fi;\
97+ fi;\
98+ if [ ! -z "$BINPATH" ]; then\
99+ if [[ $BINPATH == *"/"* ]]; then\
100+ mkdir -p "$(dirname "${BINPATH}")";\
101+ cp "$BIN" "${BINPATH}";\
102+ else\
103+ cp "$BIN" "/root/bin/${BINPATH}";\
104+ fi;\
105+ else\
106+ cp "$BIN" /root/bin/;\
107+ fi;\
108+ done'
109+
110+ # Libraries
111+ RUN mkdir -p /root/lib
112+ ARG LIBRARIES
113+ ENV LIBRARIES_ENV ${LIBRARIES}
114+
115+ RUN bash -c 'set -eux;\
116+ LIBRARIES_ARR=($LIBRARIES_ENV); \
117+ for LIBRARY in "${LIBRARIES_ARR[@]}"; do cp $LIBRARY /root/lib/; done'
118+
119+ # Directories
120+ RUN mkdir -p /root/dir_abs && touch /root/dir_abs.list
121+ ARG DIRECTORIES
122+ ENV DIRECTORIES_ENV ${DIRECTORIES}
123+
124+ RUN bash -c 'set -eux;\
125+ DIRECTORIES_ARR=($DIRECTORIES_ENV);\
126+ i=0;\
127+ for DIRECTORY in "${DIRECTORIES_ARR[@]}"; do \
128+ cp -R $DIRECTORY /root/dir_abs/$i;\
129+ echo $DIRECTORY >> /root/dir_abs.list;\
130+ ((i = i + 1));\
131+ done'
132+
133+ # Final image
134+ FROM scratch
135+
136+ LABEL org.opencontainers.image.source="https://github.com/strangelove-ventures/heighliner"
137+
138+ WORKDIR /bin
139+
140+ COPY --from=infra-toolkit /busybox/busybox /bin/sh
141+ COPY --from=infra-toolkit /busybox/busybox /bin/ln
142+ COPY --from=infra-toolkit /usr/local/bin/jq /bin/
143+
144+ RUN for b in \
145+ cat date df dirname du env grep head less ls md5sum mkdir mv pwd rm sed \
146+ sha1sum sha256sum sha3sum sha512sum sleep stty tail tar tee tr vi watch which \
147+ ; do ln ln $b; done; \
148+ rm -rf sh; \
149+ ln ln sh;
150+
151+ COPY --from=build-env /root/dir_abs /root/dir_abs
152+ COPY --from=build-env /root/dir_abs.list /root/dir_abs.list
153+
154+ RUN sh -c 'i=0; while read DIR; do\
155+ PLACEDIR="$(dirname "$DIR")";\
156+ mkdir -p "$PLACEDIR";\
157+ mv /root/dir_abs/$i $DIR;\
158+ i=$((i+1));\
159+ done < /root/dir_abs.list'
160+
161+ COPY --from=alpine-3 /etc/ssl/cert.pem /etc/ssl/cert.pem
162+
163+ COPY --from=infra-toolkit /etc/passwd /etc/passwd
164+ COPY --from=infra-toolkit --chown=1025:1025 /home/heighliner /home/heighliner
165+ COPY --from=infra-toolkit --chown=1025:1025 /tmp /tmp
166+
167+ COPY --from=build-env /root/bin /bin
168+ COPY --from=build-env /root/lib /lib
169+
170+ WORKDIR /home/heighliner
171+ USER heighliner
0 commit comments