Docker 构建rust编译环境

为了解决rust交叉编译各种不兼容问题,使用docker直接构建运行时环境进行编译

Dockerfile

FROM ubuntu:24.04

LABEL org.opencontainers.image.source=https://github.com/rust-lang/docker-rust

ENV RUSTUP_HOME=/usr/local/rustup \
    CARGO_HOME=/usr/local/cargo \
    PATH=/usr/local/cargo/bin:$PATH \
    RUST_VERSION=1.88.0

RUN set -eux; \
    # apt换源
    # 因为已经使用 -e(命令失败时立即退出)所以命令之间不用 && 符号连接
    sed -i 's|http://.*archive.ubuntu.com|https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        ca-certificates \
        gcc \
        libc6-dev \
        pkg-config \
        libssl-dev \
        wget \
        ; \
    dpkgArch="$(dpkg --print-architecture)"; \
    case "${dpkgArch##*-}" in \
        amd64) rustArch='x86_64-unknown-linux-gnu'; rustupSha256='20a06e644b0d9bd2fbdbfd52d42540bdde820ea7df86e92e533c073da0cdd43c' ;; \
        armhf) rustArch='armv7-unknown-linux-gnueabihf'; rustupSha256='3b8daab6cc3135f2cd4b12919559e6adaee73a2fbefb830fadf0405c20231d61' ;; \
        arm64) rustArch='aarch64-unknown-linux-gnu'; rustupSha256='e3853c5a252fca15252d07cb23a1bdd9377a8c6f3efa01531109281ae47f841c' ;; \
        i386) rustArch='i686-unknown-linux-gnu'; rustupSha256='a5db2c4b29d23e9b318b955dd0337d6b52e93933608469085c924e0d05b1df1f' ;; \
        *) echo >&2 "unsupported architecture: ${dpkgArch}"; exit 1 ;; \
    esac; \
    # rustup换源
    #url="https://static.rust-lang.org/rustup/archive/1.28.2/${rustArch}/rustup-init"; \
    url="https://mirrors.ustc.edu.cn/rust-static/rustup/archive/1.28.2/${rustArch}/rustup-init"; \
    wget "$url"; \
    echo "${rustupSha256} *rustup-init" | sha256sum -c -; \
    chmod +x rustup-init; \
    export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static; \
    ./rustup-init -y --no-modify-path --profile minimal --default-toolchain $RUST_VERSION --default-host ${rustArch}; \
    rm rustup-init; \
    chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
    rustup --version; \
    cargo --version; \
    rustc --version; \
    apt-get remove -y --auto-remove \
        wget \
        ; \
    rm -rf /var/lib/apt/lists/*; \
    # cargo 换源
    echo '[source.crates-io]\n\
    replace-with = "ustc"\n\
    [source.ustc]\n\
    registry = "https://mirrors.ustc.edu.cn/crates.io-index"' > $CARGO_HOME/config.toml;

WORKDIR /app

# 利用 Docker 层缓存优化:先复制配置文件和依赖声明
# 这样只有在 Cargo.toml/Cargo.lock 改变时才会重新编译依赖
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs \
    && cargo build --release \
    && rm -f target/release/usdt-bridge*

# 现在复制实际源代码并构建
COPY src ./src

# 强制更新源码文件时间戳,确保 Cargo 知道需要重新编译应用代码
RUN touch src/main.rs && cargo build --release


# 层缓存另一种判断写法
COPY Cargo.toml Cargo.lock ./
RUN mkdir -p src
RUN [ ! -f src/main.rs ] && echo "fn main() {}" > src/main.rs || true
RUN cargo build --release && rm -f target/release/usdt-bridge*

COPY src ./src

RUN touch src/main.rs && cargo build --release

shell

#!/bin/bash

BUILDER="usdt-bridge-builder"
TARGET="/app/target/release/usdt-bridge"

docker build -t $BUILDER .

CONTAINER=$(docker create $BUILDER)

docker cp $CONTAINER:/app/target/release/usdt-bridge ~

docker rm $CONTAINER

echo "file copied to $HOME/usdt-bridge"

  • 主要都来自 https://github.com/rust-lang/docker-rust rust官方镜像的构建方式
  • 替换了运行时环境依赖 (debian:bullseye-slim -> ubuntu:24.04)
  • 对apt-get rustup cargo 进行了换源
posted @ 2025-08-14 18:13  等你下课啊  阅读(59)  评论(0)    收藏  举报