Docker构建Rust镜像时diesel_migrations宏Panic问题求助
解决Docker构建Rust项目时diesel_migrations宏找不到迁移目录的问题
问题分析
你遇到的Failed to receive migrations dir from None错误,核心原因是Docker构建阶段未挂载migrations目录:diesel_migrations的embed_migrations!宏在编译时需要读取项目根目录下的migrations文件夹内容,但当前Dockerfile的build阶段仅绑定了src、Cargo.toml、Cargo.lock,导致编译容器无法访问迁移文件,宏执行失败。
本地构建正常是因为本地环境中migrations目录直接可见,不受挂载限制。
修复方案
1. 修改Dockerfile,添加migrations目录挂载
在build阶段的RUN指令中,新增一行--mount绑定migrations目录:
RUN --mount=type=bind,source=src,target=src \ --mount=type=bind,source=Cargo.toml,target=Cargo.toml \ --mount=type=bind,source=Cargo.lock,target=Cargo.lock \ # 新增这一行,挂载migrations目录到容器内 --mount=type=bind,source=migrations,target=migrations \ --mount=type=cache,target=/app/target/,id=rust-cache-${APP_NAME}-${TARGETPLATFORM} \ --mount=type=cache,target=/usr/local/cargo/git/db \ --mount=type=cache,target=/usr/local/cargo/registry/ \ xx-cargo build --locked --release --target-dir ./target && \ cp ./target/$(xx-cargo --print-target-triple)/release/$APP_NAME /bin/server && \ xx-verify /bin/server
2. 恢复embed_migrations!的默认路径
如果你的migrations目录和src同级(项目根目录下),直接使用默认宏调用即可,无需指定路径:
pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
3. 重新执行构建命令
docker build --tag docker-rust-image-test .
验证逻辑
挂载migrations目录后,编译容器能访问到迁移文件,embed_migrations!宏可以正常读取并将迁移内容嵌入到二进制文件中,构建即可顺利完成。
内容的提问来源于stack exchange,提问作者Bayrsaihan Tergeltengis
相关产品推荐
相关产品推荐

