如何在Mac平台上将Rust项目编译为 alpine Linux 下的可执行程序
环境准备
- 需要 Mac 本机安装 python3(3.11及以上) 或者 brew
- 需要 Mac 本机安装 Rust(1.77及以上)
安装 zig 语言包及工具
# 安装 zig 语言包及工具,python方式
pip3 install ziglang
或者 brew 方式
brew install zig
安装 Rust 编译插件
# 安装 cargo-zigbuild
cargo install cargo-zigbuild
# 使用rustup添加
rustup target add x86_64-unknown-linux-musl
并在 ~/.cargo/config.toml
中增加配置
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
构建命令
在Rust项目根目录执行如下编译命令,注意与非跨平台编译的区别:
cargo zigbuild --release --target x86_64-unknown-linux-musl
制作最小Docker镜像
Dockerfile 文件:
FROM scratch
WORKDIR /opt/app
COPY ./target/x86_64-unknown-linux-musl/release/web-hook-rs .
COPY ./Rocket.toml .
CMD [ "/opt/app/web-hook-rs" ]
构建Docker镜像:
docker build -t web-hook:0.0.1 .
运行测试
docker run -it web-hook:0.0.1
# 容器输出
# Rocket has launched from http://0.0.0.0:8080
容器正常启动了Rocket应用并输出上述文字信息,表明测试成功!
Rust和Go的应用对比
构建好的Rust应用镜像大小是 13.5MB
,其中交叉编译后的 ./target/x86_64-unknown-linux-musl/release/web-hook-rs
是 9.9MB
;
相比较而言,使用 go
语言编写的相同功能程序的可执行文件大小是 27MB
。
即 Rust
相同功能的程序编译的大小大约是 Go
生成的 50%
, 甚至更小到 40%
。可能是 Go
加入运行时的关系。
但 Rust 的语法确实相对更加复杂,所以可能需要平衡研发效率、运行效率及磁盘占用(传输效率)等各个因素。
注意事项
以上示例,本人在x86的MacBookPro环境运行通过,其他环境未进行测试。