如何为子目录中的Dockerfile执行docker build命令并解决COPY错误?
问题场景
项目根目录有主.dockerfile负责构建应用镜像,子目录中存放了ECS心跳任务的专用Dockerfile和Terraform脚本。执行docker build时出现以下错误:
Step 8/11 : COPY /home/shrirang2004/project-name/target/project-name-1.0.0-SNAPSHOT.jar /opt/project-name/jarFile/
COPY failed: file not found in build context or excluded by .dockerignore: stat home/shrirang2004/project-name/target/project-name-1.0.0-SNAPSHOT.jar: file does not exist
解决方法
放弃绝对路径,使用构建上下文内的相对路径
Docker构建时仅能访问docker build命令执行目录(即构建上下文)内的文件,绝对路径会被解析为相对于构建上下文的路径,自然找不到文件。假设项目结构如下:project-name/ ├── target/ │ └── project-name-1.0.0-SNAPSHOT.jar ├── main.dockerfile └── heartbeat/ └── Dockerfile # 心跳任务专用Dockerfile从项目根目录执行构建命令(指定子目录的Dockerfile):
docker build -f heartbeat/Dockerfile .同时修改子目录Dockerfile中的COPY指令为相对路径:
COPY target/project-name-1.0.0-SNAPSHOT.jar /opt/project-name/jarFile/检查
.dockerignore配置
确认项目根目录的.dockerignore文件没有包含target/规则,如果有则删除该行,避免Docker忽略jar包所在目录。确认jar包已生成
先执行项目构建命令(如Maven的mvn package),确保target/目录下确实存在project-name-1.0.0-SNAPSHOT.jar文件。
内容的提问来源于stack exchange,提问作者Shrirang Kadale

