最近开始学习《陈天 · Rust 编程第一课》,在用docker
镜像打包构建代码示例时,每次都会在更新crate.io
索引上等上一会,即便在没有修改Cargo.tomal
依赖的前提下。
想着难道没有办法缓存下更新么,于是就有了这篇新手踩坑指南。
本地缓存 - 失败
查阅有在docker
中指定CARGO_HOME
到宿主机来缓存crate.io
索引
命令如下:
1 | docker run --rm --user "$(id -u)":"$(id -g)" -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e CARGO_HOME=".cargo" rust cargo run |
结果,镜像run失败了
1 | Compiling libc v0.2.107 |
一番查阅,应该是环境不一致时pkg-config
编译时链接库有问题,详见 Rust 交叉编译 OSX 二进制失败原因分析 和 Unable to run a Docker image with a Rust executable
镜像缓存 - 成功
然后就搜到了这篇cache-rust-dependencies-with-docker-build
真是非常tricky!
思想很简单,就是缓存要在依赖不变的前提下,而docker build时源代码更改会使缓存的docker layer
失效。
那就先用一个不会变得源代码编译依赖,编译好依赖缓存layer,再文件替换到实际代码,重新进行编译就正常运行加缓存两不误了。
具体构建方式如下:
1 | FROM rust |
这里构建参数
SRC_DIR
是为了指定不同代码,复用同一个Dockerfile
相应的Cargo.toml
指定打包的程序名和路径
1 | [[bin]] |
打包和运行则可以一行命令搞定:
1 | # run.sh |
运行时:
1 | eg: |
完美缓存了依赖更新,可以继续学习了
另外也推荐下陈天老师的rust课,由浅入深,感兴趣的同学可以试试
本文代码示例详见rust-koan
如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2021/11/21/cache-rust-dependencies-with-docker-build.html