使用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拷贝正常的错觉。
修复方案
- 如果不需要本地开发时实时同步代码修改,直接删除
volumes这一行配置即可,构建出的镜像内容会完全符合预期。 - 如果是开发场景需要挂载本地代码实现热更新,把挂载配置修改为
- ./webapp:/webapp,只挂载webapp子目录到容器内的对应路径即可。
Docker Compose 构建上下文配置要点
build.context:指定构建的根目录,Dockerfile中所有相对路径都默认相对于这个目录,默认值为docker-compose.yml所在的目录。- 如果Dockerfile不在
context指定的目录下,或者文件名不是默认的Dockerfile,可以额外添加build.dockerfile字段指定Dockerfile的路径,比如context设为项目根目录时,可搭配dockerfile: ./webapp/Dockerfile使用。
内容的提问来源于stack exchange,提问作者tjruesch
相关产品推荐
相关产品推荐

