通过docker编译rust
在windows开发后,想编译后在linux里面运行。测试通过docker编译后看能否可以在linux里面运行。
linux环境使用的是wsl1 Debian,
创建一个普通rust文件demo2.rs:
1 | fn main() { |
普通编译
下载rust镜像
1 | docker pull rust:1.72.1 |
进入容器后手动编译
1 | 进入容器 |
编译后正常运行。
之后通过wsl运行main提示./demo2: /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.33' not found (required by ./demo2)
通过alpine镜像编译
下载镜像
1 | docker pull rust:1.72.1-alpine3.18 |
alpine 使用的是 musl libc
1 | 进入容器 |
编译后正常运行。
然后通过wsl编译后正常运行。
添加tokio后编译(alpine编译失败)
使用cargo创建一个项目。添加tokio依赖
Cargo.toml文件
1 | tokio = {version="1.32.0", features = ["full"]} |
main.rs文件
1 |
|
编译项目
1 | docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp rust:1.72.1-alpine3.18 cargo build --release |
使用alpine
镜像编译过程中tokio-macros
编译失败,提示失败x86_64-alpine-linux-musl/bin/ld: cannot find crti.o: No such file or directory
。
进入容器
执行命令find /usr/ -name crti*
找到文件,添加环境变量
1 | LIBRARY_PATH=/usr/local/rustup/toolchains/1.72.1-x86_64-unknown-linux-musl/lib/rustlib/x86_64-unknown-linux-musl/lib/self-contained/:$LIBRARY_PATH |
还是编译失败,提示 (signal: 11, SIGSEGV: invalid memory reference)
等信息。
未找到解决办法。
添加tokio后编译(改为rust:1.72.1)
一样的编译流程
1 | docker run --rm -v ${PWD}:/usr/src/myapp -w /usr/src/myapp rust:1.72.1 cargo build --release |
编译成功后,在wsl里面运行和之前出现一样的错误./demo2: /lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.33' not found (required by ./demo2)
进入容器
1 | docker run -v ${PWD}:/usr/src/myapp --rm -it --entrypoint bash rust:1.72.1 |
编译成功,切换到wsl在target/x86_64-unknown-linux-musl
执行编译后文件正常。
待处理
可以自己创建镜像然后添加命令rustup target add x86_64-unknown-linux-musl
,生成自定义镜像,以免每次需要下载。