Docker构建时从父目录外复制文件的异常问题求助
问题分析与解决方法
问题根源
- 运行时卷挂载覆盖构建内容:docker-compose中
volumes: - .:/code的.代表docker-compose.yaml所在的目录(即/App的上一级目录),运行时这个目录会被挂载到容器的/code路径,直接覆盖了Dockerfile构建阶段复制到/code的内容,所以执行ls看到的是上一级目录的所有文件(包括/App文件夹)。 - 构建与运行路径不匹配:Dockerfile的
COPY . .基于build: context: ./App复制/App目录下的内容到容器/code,但运行时的卷挂载替换了该路径下的内容。
解决方案
方案1:修正卷挂载路径
修改docker-compose.yaml中的volumes配置,将/App目录挂载到容器/code:
services: dash: # 其他配置保持不变 volumes: - ./App:/code
这样挂载的内容和Dockerfile构建时的复制内容一致,运行ls会显示/App目录下的文件。
方案2:移除不必要的卷挂载
如果不需要在运行时同步本地文件(仅测试构建结果),直接删除volumes配置:
services: dash: build: context: ./App dockerfile: Dockerfile.dash container_name: dash_dash command: ls ports: - "80:8080"
此时容器/code中的内容就是Dockerfile构建阶段复制的/App目录文件。
方案3:调整构建上下文(可选,优化目录结构)
若希望构建上下文为docker-compose所在目录,同时指定Dockerfile路径:
services: dash: build: context: . dockerfile: App/Dockerfile.dash # 其他配置不变 volumes: - ./App:/code
Dockerfile中的COPY . .会基于新的上下文(当前目录)复制内容,需确保requirements.txt等文件路径正确,或调整Dockerfile中的COPY路径为COPY App/requirements.txt .。
验证方法
修改配置后,重新构建并运行容器:
docker-compose up --build
此时执行ls命令会显示/App目录下的目标文件,而非上一级目录内容。
内容的提问来源于stack exchange,提问作者user287023
相关产品推荐
相关产品推荐

