构建阶段

为了构建的稳定,先用Debian的镜像做一个基础的构建镜像

文件:Dockerfile.base

FROM debian:bookworm-slim

ENV RUSTUP_UPDATE_ROOT="https://mirrors.ustc.edu.cn/rust-static/rustup"
ENV RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup"
    

# 安装必要的工具和依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    ca-certificates \
    build-essential \
    pkg-config \
    libssl-dev \
    && rm -rf /var/lib/apt/lists/*

# 安装 Rustup 和 Rust
RUN curl -v https://sh.rustup.rs -sSf | sh -s -- -y \
    && ~/.cargo/bin/rustup target add x86_64-unknown-linux-musl

# 设置环境变量
ENV PATH="/root/.cargo/bin:${PATH}"

# 设置工作目录
WORKDIR /app

并使用命令:docker build -f Dockerfile.base -t rust-base:latest .在本地提前构建好基础的镜像

编译打包阶段

使用上一步构建的debian基础镜像,增加x86_64-unknown-linux-musl静态工具链,并进行编译,使用alpine镜像作为rust程序运行镜像

文件:Dockerfile

# 使用提前构建好的基础镜像
FROM rust-base:latest AS builder

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . .
RUN ~/.cargo/bin/rustup target add x86_64-unknown-linux-musl
# 构建应用程序
RUN cargo build --release --target x86_64-unknown-linux-musl

# 运行阶段使用 Alpine
FROM alpine:latest

# 安装运行时必要的依赖(根据你的应用需求)
# RUN apk add --no-cache openssl curl

# 设置工作目录
WORKDIR /app

# 从构建阶段复制已编译的二进制文件
COPY --from=builder /app/target/x86_64-unknown-linux-musl/release/au92-blog .
COPY .env ./
COPY post ./post
COPY templates ./templates
COPY static ./static

# 暴露端口(如果需要)
EXPOSE 4000

# 设置运行命令
CMD ["./au92-blog"]