Files
telemt-docker/Dockerfile
2026-01-28 15:38:54 +03:00

77 lines
2.4 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syntax=docker/dockerfile:1.7
ARG TELEMT_REPO=https://github.com/telemt/telemt.git
ARG TELEMT_REF=main
FROM --platform=$TARGETPLATFORM rust:alpine AS build
ARG TELEMT_REPO
ARG TELEMT_REF
ENV CARGO_NET_GIT_FETCH_WITH_CLI=true \
CARGO_TERM_COLOR=always \
CARGO_PROFILE_RELEASE_LTO=true \
CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 \
CARGO_PROFILE_RELEASE_DEBUG=false \
OPENSSL_STATIC=1
WORKDIR /src
RUN --mount=type=cache,target=/var/cache/apk \
apk add --no-cache \
ca-certificates git \
build-base musl-dev pkgconf perl \
binutils \
openssl-dev openssl-libs-static \
zlib-dev zlib-static \
&& update-ca-certificates
RUN --mount=type=cache,target=/root/.cache/git \
git clone --depth=1 --branch "${TELEMT_REF}" "${TELEMT_REPO}" . \
|| (git init . && git remote add origin "${TELEMT_REPO}" \
&& git fetch --depth=1 origin "${TELEMT_REF}" \
&& git checkout --detach FETCH_HEAD)
# rustfmt нужен для cargo fmt
RUN rustup component add rustfmt
RUN --mount=type=cache,target=/usr/local/cargo/registry \
--mount=type=cache,target=/usr/local/cargo/git \
--mount=type=cache,target=/src/target \
set -eux; \
\
cargo fmt --all; \
\
if [ ! -f Cargo.lock ]; then cargo generate-lockfile; fi; \
\
# best-effort fixes (не валим билд, если что-то не применилось)
(cargo fix --bin "telemt" -p telemt --allow-dirty --allow-staged || true); \
\
# после fix — снова форматируем
cargo fmt --all; \
\
cargo build --release --locked --bin telemt; \
\
mkdir -p /out; \
install -Dm755 target/release/telemt /out/telemt; \
strip /out/telemt; \
\
# distroless/static требует полностью статический бинарь:
# у динамического ELF будет INTERP
if readelf -lW /out/telemt | grep -q "Requesting program interpreter"; then \
echo "ERROR: telemt is dynamically linked (has INTERP) -> cannot run in gcr.io/distroless/static"; \
exit 1; \
fi
FROM gcr.io/distroless/static:nonroot AS runtime
STOPSIGNAL SIGINT
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=build /out/telemt /usr/local/bin/telemt
EXPOSE 443/tcp 9090/tcp
USER nonroot:nonroot
ENTRYPOINT ["/usr/local/bin/telemt"]
CMD ["/etc/telemt.toml"]