mirror of
https://github.com/Xevion/time-banner.git
synced 2025-12-05 23:16:35 -06:00
feat: improve dockerfile, better stages
This commit is contained in:
63
Dockerfile
63
Dockerfile
@@ -1,45 +1,70 @@
|
|||||||
# Build Stage
|
# Build Stage
|
||||||
FROM rust:1.81.0 as builder
|
FROM rust:1.81.0-alpine as builder
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
musl-dev \
|
||||||
|
pkgconfig \
|
||||||
|
openssl-dev
|
||||||
|
|
||||||
|
WORKDIR /usr/src
|
||||||
RUN USER=root cargo new --bin time-banner
|
RUN USER=root cargo new --bin time-banner
|
||||||
WORKDIR ./time-banner
|
WORKDIR /usr/src/time-banner
|
||||||
ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
|
|
||||||
COPY ./Cargo.toml ./Cargo.toml
|
# Copy dependency files for better layer caching
|
||||||
|
COPY ./Cargo.toml ./Cargo.lock* ./build.rs ./
|
||||||
|
# Copy the timezone data file needed by build.rs
|
||||||
|
COPY ./src/abbr_tz ./src/abbr_tz
|
||||||
|
|
||||||
# Build empty app with downloaded dependencies to produce a stable image layer for next build
|
# Build empty app with downloaded dependencies to produce a stable image layer for next build
|
||||||
RUN cargo build --release
|
RUN cargo build --release
|
||||||
|
|
||||||
# Build web app with own code
|
# Build web app with own code
|
||||||
RUN rm src/*.rs
|
RUN rm src/*.rs
|
||||||
ADD . ./
|
COPY ./src ./src
|
||||||
RUN rm ./target/release/deps/time_banner*
|
RUN rm ./target/release/deps/time_banner*
|
||||||
RUN cargo build --release
|
RUN cargo build --release
|
||||||
|
|
||||||
|
# Strip the binary to reduce size
|
||||||
|
RUN strip target/release/time-banner
|
||||||
|
|
||||||
FROM debian:bullseye-slim
|
# Runtime Stage - Alpine for smaller size and musl compatibility
|
||||||
|
FROM alpine:3.19
|
||||||
ARG APP=/usr/src/app
|
ARG APP=/usr/src/app
|
||||||
|
ARG APP_USER=appuser
|
||||||
|
ARG UID=1000
|
||||||
|
ARG GID=1000
|
||||||
|
|
||||||
RUN apt-get update \
|
# Install runtime dependencies
|
||||||
&& apt-get install -y ca-certificates tzdata \
|
RUN apk add --no-cache \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
ca-certificates \
|
||||||
|
tzdata
|
||||||
|
|
||||||
ENV TZ=Etc/UTC \
|
ENV TZ=Etc/UTC
|
||||||
APP_USER=appuser
|
|
||||||
|
|
||||||
RUN groupadd $APP_USER \
|
# Create user with specific UID/GID
|
||||||
&& useradd -g $APP_USER $APP_USER \
|
RUN addgroup -g $GID -S $APP_USER \
|
||||||
|
&& adduser -u $UID -D -S -G $APP_USER $APP_USER \
|
||||||
&& mkdir -p ${APP}
|
&& mkdir -p ${APP}
|
||||||
|
|
||||||
COPY --from=builder /time-banner/target/release/time-banner ${APP}/time-banner
|
# Copy application files
|
||||||
COPY --from=builder /time-banner/src/fonts ${APP}/fonts
|
COPY --from=builder --chown=$APP_USER:$APP_USER /usr/src/time-banner/target/release/time-banner ${APP}/time-banner
|
||||||
COPY --from=builder /time-banner/src/templates ${APP}/templates
|
COPY --from=builder --chown=$APP_USER:$APP_USER /usr/src/time-banner/src/fonts ${APP}/fonts
|
||||||
|
COPY --from=builder --chown=$APP_USER:$APP_USER /usr/src/time-banner/src/templates ${APP}/templates
|
||||||
|
|
||||||
RUN chown -R $APP_USER:$APP_USER ${APP}
|
# Set proper permissions
|
||||||
|
RUN chmod +x ${APP}/time-banner
|
||||||
|
|
||||||
USER $APP_USER
|
USER $APP_USER
|
||||||
WORKDIR ${APP}
|
WORKDIR ${APP}
|
||||||
|
|
||||||
EXPOSE 3000
|
# Use ARG for build-time configuration, ENV for runtime
|
||||||
ENV PORT 3000
|
ARG PORT=3000
|
||||||
|
ENV PORT=${PORT}
|
||||||
|
EXPOSE ${PORT}
|
||||||
|
|
||||||
|
# Add health check (using wget since curl isn't in Alpine by default)
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD wget --quiet --tries=1 --spider http://localhost:${PORT}/health || exit 1
|
||||||
|
|
||||||
CMD ["./time-banner"]
|
CMD ["./time-banner"]
|
||||||
Reference in New Issue
Block a user