You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose构建Rust子模块项目时文件找不到问题排查

解决Docker Compose构建Rust服务时找不到Cargo文件的问题

问题场景

我有一个包含多个子项目的代码仓库,目录结构如下:

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配置

    1. 确认api_endpoint目录下确实存在Cargo.toml、Cargo.lock、config.toml和src目录,没有被误删或移动。
    2. 检查api_endpoint目录下是否有.dockerignore文件,如果有,确保没有忽略上述文件或目录。比如如果.dockerignore里写了*但没有添加!Cargo.toml等例外规则,会导致所有文件被忽略,COPY命令自然找不到文件。
  • (可选)优化Dockerfile的工作目录设置
    虽然这不是导致报错的直接原因,但你的Dockerfile中WORKDIR .的设置不够清晰,建议改为具体目录(比如/app),避免与容器系统目录混淆:

    WORKDIR /app
    

    这个修改不影响原逻辑,只是让容器内的文件结构更清晰。

另外注意:你的Dockerfile中CMD指定的二进制文件是sales_manager,但docker-compose中command指定的是api_endpoint,运行时会以command的配置为准,这部分如果是笔误建议统一。

内容的提问来源于stack exchange,提问作者Th0rgal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:14:51