# syntax=docker/dockerfile:1 FROM --platform=$BUILDPLATFORM rust:1-slim AS builder ARG TARGETARCH RUN set -eu; \ case "${TARGETARCH}" in \ amd64) rust_target=x86_64-unknown-linux-musl; cross_packages="" ;; \ arm64) rust_target=aarch64-unknown-linux-musl; cross_packages="gcc-aarch64-linux-gnu" ;; \ *) echo "unsupported target architecture: ${TARGETARCH}" >&2; exit 1 ;; \ esac; \ printf '%s\n' "${rust_target}" > /tmp/rust-target; \ sed -i 's|http://deb.debian.org|https://deb.debian.org|g' \ /etc/apt/sources.list.d/debian.sources 2>/dev/null || true; \ apt-get update; \ apt-get install -y --no-install-recommends musl-tools ca-certificates ${cross_packages}; \ rm -rf /var/lib/apt/lists/*; \ rustup target add "${rust_target}" WORKDIR /app COPY Cargo.toml Cargo.lock ./ RUN --mount=type=cache,target=/usr/local/cargo/registry \ mkdir -p src \ && printf 'fn main() {}' > src/main.rs \ && cargo fetch --locked --target "$(cat /tmp/rust-target)" COPY src ./src RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/app/target \ if [ "${TARGETARCH}" = "arm64" ]; then \ export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc; \ fi \ && rust_target="$(cat /tmp/rust-target)" \ && cargo build --release --locked --target "${rust_target}" \ && mkdir -p /out \ && cp "/app/target/${rust_target}/release/hermes" /out/hermes FROM scratch AS runtime COPY --from=builder /out/hermes /usr/local/bin/hermes COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt ENV HERMES_CONFIG_PATH=/etc/hermes/hermes.yaml WORKDIR /etc/hermes USER 65532:65532 EXPOSE 8080 1080 ENTRYPOINT ["/usr/local/bin/hermes"]