Rust Docker编译配置方案

简单记录一下UXCI 这个Rust命令行工具的发布过程中遇到的问题以及解决方案. 问题: 运行环境中GLIBC缺失 问题的表现是: Linux下的编译结果无法在部分其他环境执行 报错内容为: uxcirs: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by uxcirs) 这个错误是因为rust使用了动态链接, 因此依赖于系统的glibc库. 编译时使用的GLIBC_2.28(或者其他版本)在运行时的机器上不存在, 因此无法正常运行. 获取可用的 GLIBC 版本: ldd --version | head -1 各环境下的版本分别为: 镜像ubuntu:18.04: ldd (Ubuntu GLIBC 2.27-3ubuntu1.6) 2.27 (sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005931b) VPS: ldd (Debian GLIBC 2.28-10+deb10u2) 2.28 镜像rust:latest: ldd (Debian GLIBC 2.31-13+deb11u5) 2.31 (sha256:557ff96cf0d2bed8fe24aded88a5dabbca8d71ff4fa66b696ed8a295247c92cc) 因此, VPS上编译得到的文件无法在 Ubuntu 18.04 中运行. 使用rust:latest镜像编译得到的文件无法在VPS和Ubuntu 18.04中运行. 让运行环境适配可执行文件也是一种选项, 但这个一般是对使用者来说的, 因此这次的需求中可以不用考虑. 而为了让二进制文件能适配更多的运行环境, 大致上有这几种思路: 使用静态链接 降低glibc版本 使用静态链接 StackOverflow中的 这里 还提到了静态编译glibc, 之后有需要的话可以尝试一下 降低glibc版本 由于Docker的存在, 这个选项实际执行起来还是比较方便的....

2023-04-06 · AutumnSun