2024-08-21 09:06:35 +00:00
|
|
|
# This Dockerfile has been specifically crafted to be run on an AMD64 build host, where
|
|
|
|
# the build should compile for both amd64 and arm64 targets
|
|
|
|
#
|
|
|
|
# Building on any other platform, or building for only a single target will be significantly
|
|
|
|
# slower compared to a platform agnostic Dockerfile, or might not work at all
|
|
|
|
#
|
|
|
|
# This has been done to make this file be optimized for use within GitHub Actions,
|
|
|
|
# as using QEMU to compile takes way too long (multiple hours)
|
|
|
|
|
2022-10-31 21:46:34 +00:00
|
|
|
# Builder
|
2024-08-21 09:41:40 +00:00
|
|
|
FROM --platform=linux/amd64 rust:1.80.1-slim AS builder
|
2022-10-31 21:46:34 +00:00
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
# Add extra build dependencies here
|
2024-08-21 09:06:35 +00:00
|
|
|
RUN apt-get update && apt install -yqq \
|
2024-08-19 10:34:51 +00:00
|
|
|
cmake gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu libpq-dev
|
2022-10-31 21:46:34 +00:00
|
|
|
|
2024-08-21 09:06:35 +00:00
|
|
|
# Manually compile an arm64 build of libpq
|
|
|
|
RUN wget https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.bz2 && \
|
|
|
|
tar xjf postgresql-16.4.tar.bz2 && \
|
|
|
|
cd postgresql-16.4 && \
|
|
|
|
./configure --host=aarch64-linux-gnu --enable-shared --disable-static --without-readline --without-zlib --without-icu && \
|
|
|
|
cd src/interfaces/libpq && \
|
|
|
|
make
|
|
|
|
|
2022-10-31 21:46:34 +00:00
|
|
|
COPY . .
|
2023-09-19 11:49:32 +00:00
|
|
|
|
2024-08-12 14:14:24 +00:00
|
|
|
RUN rustup target add x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu
|
2023-09-24 11:43:30 +00:00
|
|
|
|
2024-08-12 14:14:24 +00:00
|
|
|
# Add `--no-default-features` if you don't want stats collection
|
|
|
|
RUN --mount=type=cache,target=/usr/local/cargo/registry \
|
|
|
|
--mount=type=cache,target=/app/target \
|
2024-08-21 09:06:35 +00:00
|
|
|
cargo build --release --target=x86_64-unknown-linux-gnu && \
|
|
|
|
RUSTFLAGS='-L /app/postgresql-16.4/src/interfaces/libpq -C linker=aarch64-linux-gnu-gcc' cargo build --release --target=aarch64-unknown-linux-gnu && \
|
2024-08-12 14:14:24 +00:00
|
|
|
# Copy the executables outside of /target as it'll get unmounted after this RUN command
|
|
|
|
cp /app/target/x86_64-unknown-linux-gnu/release/spoticord /app/x86_64 && \
|
|
|
|
cp /app/target/aarch64-unknown-linux-gnu/release/spoticord /app/aarch64
|
2022-10-31 21:46:34 +00:00
|
|
|
|
|
|
|
# Runtime
|
2024-08-21 09:41:40 +00:00
|
|
|
FROM debian:bookworm-slim
|
2022-10-31 21:46:34 +00:00
|
|
|
|
2023-09-24 11:43:30 +00:00
|
|
|
ARG TARGETPLATFORM
|
2024-08-12 14:14:24 +00:00
|
|
|
ENV TARGETPLATFORM=${TARGETPLATFORM}
|
2022-10-31 21:46:34 +00:00
|
|
|
|
|
|
|
# Add extra runtime dependencies here
|
2024-08-12 14:14:24 +00:00
|
|
|
RUN apt update && apt install -y ca-certificates
|
2023-09-24 11:43:30 +00:00
|
|
|
|
2024-08-12 14:14:24 +00:00
|
|
|
# Copy spoticord binaries from builder to /tmp so we can dynamically use them
|
2023-09-24 20:12:15 +00:00
|
|
|
COPY --from=builder \
|
2024-08-12 14:14:24 +00:00
|
|
|
/app/x86_64 /tmp/x86_64
|
2023-09-24 20:12:15 +00:00
|
|
|
COPY --from=builder \
|
2024-08-12 14:14:24 +00:00
|
|
|
/app/aarch64 /tmp/aarch64
|
2023-09-24 11:43:30 +00:00
|
|
|
|
2024-08-12 14:14:24 +00:00
|
|
|
# Copy appropriate binary for target arch from /tmp
|
|
|
|
RUN if [ "${TARGETPLATFORM}" = "linux/amd64" ]; then \
|
|
|
|
cp /tmp/x86_64 /usr/local/bin/spoticord; \
|
|
|
|
elif [ "${TARGETPLATFORM}" = "linux/arm64" ]; then \
|
|
|
|
cp /tmp/aarch64 /usr/local/bin/spoticord; \
|
2023-09-24 20:12:15 +00:00
|
|
|
fi
|
2023-09-24 11:43:30 +00:00
|
|
|
|
|
|
|
# Delete unused binaries
|
2023-09-24 20:12:15 +00:00
|
|
|
RUN rm -rvf /tmp/x86_64 /tmp/aarch64
|
2023-09-24 11:43:30 +00:00
|
|
|
|
2024-08-12 14:14:24 +00:00
|
|
|
ENTRYPOINT [ "/usr/local/bin/spoticord" ]
|