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 加速的配置文件
- config.toml
[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;
- 编译镜像:
docker build --no-cache . -t rust_alpine
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}"]
到这里,就可以把镜像推出去发布了。