Docker Compose构建Rust子模块项目时文件找不到问题排查
问题场景
我有一个包含多个子项目的代码仓库,目录结构如下:
root_dir/ ├── api_endpoint/ # Rust编写的API服务 │ ├── Dockerfile │ ├── Cargo.toml │ ├── Cargo.lock │ ├── config.toml │ └── ... # 其他文件和目录 ├── docker-compose.yml # 部署配置 └── ... # 其他文件和目录
docker-compose.yml中api_endpoint服务的构建配置如下:
api_endpoint: container_name: api_endpoint build: context: ./api_endpoint/ dockerfile: Dockerfile command: ./target/release/api_endpoint restart: always ports: - 8080:8080
api_endpoint目录下的Dockerfile内容为:
# 使用官方Rust镜像作为基础镜像 FROM rust:latest # 设置工作目录 WORKDIR . RUN ls -la # 复制Cargo配置文件 COPY Cargo.toml Cargo.lock config.toml ./ # 复制源代码 COPY src ./src # 构建release版本 RUN cargo build --release # 暴露端口 EXPOSE 8080 # 设置环境变量 ENV RUST_BACKTRACE "1" # 运行二进制文件 CMD ["./target/release/sales_manager"]
构建时出现错误,提示找不到Cargo.lock文件:
=> ERROR [api_endpoint 3/6] COPY Cargo.toml Cargo.lock config.toml ./ 0.0s ------ > [api_endpoint 3/6] COPY Cargo.toml Cargo.lock config.toml ./: ------ failed to solve: failed to compute cache key: failed to calculate checksum of ref 8db5d66a-6f05-4912-8572-2314030d9bab::x99t9ep9g1ec5vv0ry36p4816: "/Cargo.lock": not found
我希望尽量不修改原本在api_endpoint目录下可用的Dockerfile,怀疑是对context参数的用法理解有误。
核心原因与解决方法
你的docker-compose配置本身没有语法问题,问题出在context路径的解析逻辑和执行docker-compose命令的工作目录不匹配,或者存在文件被忽略的情况,按以下步骤排查解决:
确保在root_dir目录下执行docker-compose命令
Docker Compose中context的相对路径是基于docker-compose.yml所在的目录解析的。如果在其他目录(比如api_endpoint目录)执行构建命令,./api_endpoint/会被解析为当前工作目录下的api_endpoint子目录(比如api_endpoint/api_endpoint/),这个目录不存在,自然找不到Cargo文件。正确操作:切换到root_dir目录再执行命令:
cd /path/to/root_dir docker-compose build如果必须在其他目录执行,需要用
-f参数指定docker-compose.yml的路径,同时将context改为绝对路径:build: context: /absolute/path/to/root_dir/api_endpoint/ dockerfile: Dockerfile然后执行:
docker-compose -f /absolute/path/to/root_dir/docker-compose.yml build检查api_endpoint目录下的文件与.dockerignore配置
- 确认api_endpoint目录下确实存在
Cargo.toml、Cargo.lock、config.toml和src目录,没有被误删或移动。 - 检查api_endpoint目录下是否有
.dockerignore文件,如果有,确保没有忽略上述文件或目录。比如如果.dockerignore里写了*但没有添加!Cargo.toml等例外规则,会导致所有文件被忽略,COPY命令自然找不到文件。
- 确认api_endpoint目录下确实存在
(可选)优化Dockerfile的工作目录设置
虽然这不是导致报错的直接原因,但你的Dockerfile中WORKDIR .的设置不够清晰,建议改为具体目录(比如/app),避免与容器系统目录混淆:WORKDIR /app这个修改不影响原逻辑,只是让容器内的文件结构更清晰。
另外注意:你的Dockerfile中CMD指定的二进制文件是sales_manager,但docker-compose中command指定的是api_endpoint,运行时会以command的配置为准,这部分如果是笔误建议统一。
内容的提问来源于stack exchange,提问作者Th0rgal

