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

使用Docker Compose构建多容器应用时如何正确拷贝子项目到容器

Docker Compose 构建上下文异常问题解答

问题核心原因

你观察到的COPY . /webapp/行为异常,本质是运行时卷挂载覆盖了构建阶段的产物,和构建上下文的配置本身没有关系。

具体原因拆解

  • 你当前的构建上下文配置是完全正确的:build.context设为./webapp时,Dockerfile 中所有COPY指令的相对路径默认都是相对于./webapp目录的,所以COPY requirements.txt /webapp/和COPY . /webapp/都会拷贝webapp子目录下的内容,你直接用docker build构建webapp目录正常就是最直接的证明。
  • 异常来自你docker-compose.yml中的volumes配置:你写了- .:/webapp,这个配置会在容器启动时,把宿主机上docker-compose.yml所在的根目录直接挂载到容器内的/webapp路径,完全覆盖掉构建阶段拷贝进去的所有内容。你用ls -la调试看到的是挂载后的根目录内容,才会误以为是COPY指令出错。
  • 你认为requirements.txt拷贝正常属于巧合:要么是你的项目根目录下也存在一份同名的requirements.txt,和webapp目录下的内容一致,要么是你测试时没有察觉到挂载后的文件差异,产生了requirements.txt拷贝正常的错觉。

修复方案

  1. 如果不需要本地开发时实时同步代码修改,直接删除volumes这一行配置即可,构建出的镜像内容会完全符合预期。
  2. 如果是开发场景需要挂载本地代码实现热更新,把挂载配置修改为- ./webapp:/webapp,只挂载webapp子目录到容器内的对应路径即可。

Docker Compose 构建上下文配置要点

  • build.context:指定构建的根目录,Dockerfile中所有相对路径都默认相对于这个目录,默认值为docker-compose.yml所在的目录。
  • 如果Dockerfile不在context指定的目录下,或者文件名不是默认的Dockerfile,可以额外添加build.dockerfile字段指定Dockerfile的路径,比如context设为项目根目录时,可搭配dockerfile: ./webapp/Dockerfile使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:57:05