mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 18:38:55 +00:00
121 lines
4.7 KiB
Docker
121 lines
4.7 KiB
Docker
FROM alpine:3.18 AS build
|
|
|
|
# https://github.com/oven-sh/bun/releases
|
|
ARG BUN_VERSION=latest
|
|
|
|
# TODO: Instead of downloading glibc from a third-party source, we should
|
|
# build it from source. This is a temporary solution.
|
|
# See: https://github.com/sgerrand/alpine-pkg-glibc
|
|
|
|
# https://github.com/sgerrand/alpine-pkg-glibc/releases
|
|
# https://github.com/sgerrand/alpine-pkg-glibc/issues/176
|
|
ARG GLIBC_VERSION=2.34-r0
|
|
|
|
# https://github.com/oven-sh/bun/issues/5545#issuecomment-1722461083
|
|
ARG GLIBC_VERSION_AARCH64=2.26-r1
|
|
|
|
RUN apk --no-cache add \
|
|
ca-certificates \
|
|
curl \
|
|
dirmngr \
|
|
gpg \
|
|
gpg-agent \
|
|
unzip \
|
|
&& arch="$(apk --print-arch)" \
|
|
&& case "${arch##*-}" in \
|
|
x86_64) build="x64-baseline";; \
|
|
aarch64) build="aarch64";; \
|
|
*) echo "error: unsupported architecture: $arch"; exit 1 ;; \
|
|
esac \
|
|
&& version="$BUN_VERSION" \
|
|
&& case "$version" in \
|
|
latest | canary | bun-v*) tag="$version"; ;; \
|
|
v*) tag="bun-$version"; ;; \
|
|
*) tag="bun-v$version"; ;; \
|
|
esac \
|
|
&& case "$tag" in \
|
|
latest) release="latest/download"; ;; \
|
|
*) release="download/$tag"; ;; \
|
|
esac \
|
|
&& curl "https://github.com/oven-sh/bun/releases/$release/bun-linux-$build.zip" \
|
|
-fsSLO \
|
|
--compressed \
|
|
--retry 5 \
|
|
|| (echo "error: failed to download: $tag" && exit 1) \
|
|
&& for key in \
|
|
"F3DCC08A8572C0749B3E18888EAB4D40A7B22B59" \
|
|
; do \
|
|
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" \
|
|
|| gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \
|
|
done \
|
|
&& curl "https://github.com/oven-sh/bun/releases/$release/SHASUMS256.txt.asc" \
|
|
-fsSLO \
|
|
--compressed \
|
|
--retry 5 \
|
|
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \
|
|
|| (echo "error: failed to verify: $tag" && exit 1) \
|
|
&& grep " bun-linux-$build.zip\$" SHASUMS256.txt | sha256sum -c - \
|
|
|| (echo "error: failed to verify: $tag" && exit 1) \
|
|
&& unzip "bun-linux-$build.zip" \
|
|
&& mv "bun-linux-$build/bun" /usr/local/bin/bun \
|
|
&& rm -f "bun-linux-$build.zip" SHASUMS256.txt.asc SHASUMS256.txt \
|
|
&& chmod +x /usr/local/bin/bun \
|
|
&& cd /tmp \
|
|
&& case "${arch##*-}" in \
|
|
x86_64) curl "https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}.apk" \
|
|
-fsSLO \
|
|
--compressed \
|
|
--retry 5 \
|
|
|| (echo "error: failed to download: glibc v${GLIBC_VERSION}" && exit 1) \
|
|
&& mv "glibc-${GLIBC_VERSION}.apk" glibc.apk \
|
|
&& curl "https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-bin-${GLIBC_VERSION}.apk" \
|
|
-fsSLO \
|
|
--compressed \
|
|
--retry 5 \
|
|
|| (echo "error: failed to download: glibc-bin v${GLIBC_VERSION}" && exit 1) \
|
|
&& mv "glibc-bin-${GLIBC_VERSION}.apk" glibc-bin.apk ;; \
|
|
aarch64) curl "https://raw.githubusercontent.com/squishyu/alpine-pkg-glibc-aarch64-bin/master/glibc-${GLIBC_VERSION_AARCH64}.apk" \
|
|
-fsSLO \
|
|
--compressed \
|
|
--retry 5 \
|
|
|| (echo "error: failed to download: glibc v${GLIBC_VERSION_AARCH64}" && exit 1) \
|
|
&& mv "glibc-${GLIBC_VERSION_AARCH64}.apk" glibc.apk \
|
|
&& curl "https://raw.githubusercontent.com/squishyu/alpine-pkg-glibc-aarch64-bin/master/glibc-bin-${GLIBC_VERSION_AARCH64}.apk" \
|
|
-fsSLO \
|
|
--compressed \
|
|
--retry 5 \
|
|
|| (echo "error: failed to download: glibc-bin v${GLIBC_VERSION_AARCH64}" && exit 1) \
|
|
&& mv "glibc-bin-${GLIBC_VERSION_AARCH64}.apk" glibc-bin.apk ;; \
|
|
*) echo "error: unsupported architecture '$arch'"; exit 1 ;; \
|
|
esac
|
|
|
|
FROM alpine:3.18
|
|
|
|
# Disable the runtime transpiler cache by default inside Docker containers.
|
|
# On ephemeral containers, the cache is not useful
|
|
ARG BUN_RUNTIME_TRANSPILER_CACHE_PATH=0
|
|
ENV BUN_RUNTIME_TRANSPILER_CACHE_PATH=${BUN_RUNTIME_TRANSPILER_CACHE_PATH}
|
|
|
|
# Ensure `bun install -g` works
|
|
ARG BUN_INSTALL_BIN=/usr/local/bin
|
|
ENV BUN_INSTALL_BIN=${BUN_INSTALL_BIN}
|
|
|
|
COPY --from=build /usr/local/bin/bun /usr/local/bin/
|
|
COPY docker-entrypoint.sh /usr/local/bin/
|
|
|
|
# Temporarily use the `build`-stage /tmp folder to access the glibc APKs:
|
|
RUN --mount=type=bind,from=build,source=/tmp,target=/tmp \
|
|
addgroup -g 1000 bun \
|
|
&& adduser -u 1000 -G bun -s /bin/sh -D bun \
|
|
&& apk --no-cache --force-overwrite --allow-untrusted add \
|
|
/tmp/glibc.apk \
|
|
/tmp/glibc-bin.apk \
|
|
&& ln -s /usr/local/bin/bun /usr/local/bin/bunx \
|
|
&& which bun \
|
|
&& which bunx \
|
|
&& bun --version
|
|
|
|
WORKDIR /home/bun/app
|
|
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
|
|
CMD ["/usr/local/bin/bun"]
|