Rust 学习笔记

Rust 1.85.1 musl 打包镜像制作&发布

2025-03-20  本文已影响0人  国服最坑开发

0x00 需求

在 mac 和 ubuntu 原生系统下,死活打不出 静态 musl 包。
查了一大圈, 还是决定使用 Docker 方式进行编译。

本篇参考 rust 官方 镜像脚本: https://github.com/rust-lang/docker-rust/blob/master/stable/alpine3.21/Dockerfile

整合国内rust 安装加速镜像,可快速完成编译镜像制作。

0x01 创建镜像

先准备一个 cargo 加速的配置文件

[source.crates-io]
replace-with = 'aliyun'

[source.aliyun]
registry = "sparse+https://mirrors.aliyun.com/crates.io-index/"

把上面的文件整合入镜像

FROM alpine:3.21

ENV RUSTUP_UPDATE_ROOT=https://mirrors.aliyun.com/rustup/rustup
ENV RUSTUP_DIST_SERVER=https://mirrors.aliyun.com/rustup
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

COPY config.toml /usr/local/cargo/config.toml

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

RUN apk add --no-cache ca-certificates gcc curl vim musl-dev pkgconfig openssl-dev perl make cmake gcc g++ build-base linux-headers protoc

RUN curl --proto '=https' --tlsv1.2 -sSf https://mirrors.aliyun.com/repo/rust/rustup-init.sh | sh -s -- -y --no-modify-path --profile minimal --default-toolchain stable --default-host x86_64-unknown-linux-musl

RUN chmod -R a+w $RUSTUP_HOME $CARGO_HOME; \
    rustup --version; \
    cargo --version; \
    rustc --version;

0x02 Docker指定网卡 (备用)

主机有多网卡时,可以指定其中一张网卡访问公网

docker network create --subnet=192.168.10.0/24 --gateway=192.168.10.1 wifi
docker run --network wifi -itd --name build -v .:/app -w /app rust_alpine:latest

0x03 使用

启用一个 docker 实例,把代码目录映射进去

cd your_work_dir
docker run -itd --name build -v .:/app -w /app rust_alpine:latest

登录实例,在内部启动编译

docker exec -it build sh

确认工具链, 是否为 musl

rustup toolchain list
#输出 stable-x86_64-unknown-linux-musl (active, default)

执行编译

cargo build --release --target x86_64-unknown-linux-musl

也可以直接在宿主机,执行下面的命令

docker exec -it build cargo build --release --target x86_64-unknown-linux-musl

再来个 减少体积的指令:

docker exec -it build strip target/x86_64-unknown-linux-musl/release/${bin_name}

0x04 本地镜像打包

FROM alpine:3.21

WORKDIR /app

COPY ./target/x86_64-unknown-linux-musl/release/${bin_name} /app/r_robot_event_hub
COPY ./log4rs.yml /app/log4rs.yml

CMD ["/app/${bin_name}"]

到这里,就可以把镜像推出去发布了。

上一篇 下一篇

猜你喜欢

热点阅读