使用GitHub Action创建Docker镜像失败问题求助
GitHub Action构建Docker镜像失败:Dockerfile找不到
问题场景
使用GitHub Action构建BW6应用,生成Jar文件后创建Docker镜像时,代码拉取和Jar打包步骤均成功,但执行「Build and push images」步骤报错:
ERROR: failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount1297911053/Dockerfile: no such file or directory
进程以退出码1终止。
当前GitHub Action工作流配置
name: Tibco Workflow on: workflow_dispatch: # 允许手动触发工作流 jobs: build: runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v2 - name: Set up JDK and Maven uses: actions/setup-java@v2 with: distribution: 'adopt' java-version: '11' - name: Print Current Directory run : ls -la /home/runner/work/sm.baseSchema/sm.baseSchema/src/sm.baseSchemas/target - name: Build and Package BW6 Application run: | cd src/sm.baseSchemas mvn clean package -P mavenize env: MAVEN_OPTS: '-Dmaven.repo.local=./.m2/repository' - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: USERNAME password: PASSWORD - name: Build and push images run : | docker build -t smbase:smbase -f /home/runner/work/sm.baseSchema/sm.baseSchema/src/sm.baseSchemas/target/Dockerfile .
当前Dockerfile内容
FROM tibco/bwce:latest WORKDIR /app COPY /home/runner/work/sm.baseSchema/sm.baseSchema/src/sm.baseSchemas/target/sm.baseSchemas_1.0.0.202303271123.jar /app/ EXPOSE 8080 CMD ["java", "-jar", "sm.baseSchemas_1.0.0.202303271123.jar"]
错误原因
- Dockerfile路径错误:
docker build命令中使用绝对路径指定Dockerfile,但Docker构建时会以当前目录(.)作为上下文,无法识别宿主机的绝对路径,导致找不到文件。 - COPY指令路径错误:Dockerfile中的COPY使用了宿主机绝对路径,而COPY的源路径必须是相对于构建上下文的相对路径,否则Docker无法在上下文内定位文件。
修复方案
1. 修正Dockerfile的COPY指令
将Jar文件的源路径改为相对构建上下文的路径(假设构建上下文为仓库根目录,Jar文件位于src/sm.baseSchemas/target/下):
FROM tibco/bwce:latest WORKDIR /app # 使用相对路径复制Jar文件(相对于构建上下文) COPY src/sm.baseSchemas/target/sm.baseSchemas_1.0.0.202303271123.jar /app/ EXPOSE 8080 CMD ["java", "-jar", "sm.baseSchemas_1.0.0.202303271123.jar"]
2. 调整GitHub Action中的构建命令
情况A:Dockerfile放在仓库根目录(推荐)
直接在根目录执行构建,无需指定Dockerfile路径(默认查找当前目录下的Dockerfile):
- name: Build and push images run : | docker build -t smbase:smbase .
情况B:Dockerfile确实在target目录
可以切换到target目录执行构建,或者用相对路径指定Dockerfile:
- name: Build and push images run : | # 方式1:切换到target目录构建 cd src/sm.baseSchemas/target docker build -t smbase:smbase . # 方式2:在根目录用相对路径指定Dockerfile # docker build -t smbase:smbase -f src/sm.baseSchemas/target/Dockerfile .
额外优化建议
- 建议将Dockerfile放在仓库根目录,避免路径混乱,便于后续维护。
- 避免硬编码Jar文件名,可在Maven中通过
${project.artifactId}-${project.version}.jar动态生成,或在GitHub Action中通过命令提取Jar文件名,减少维护成本。
内容的提问来源于stack exchange,提问作者Niladri Dey
相关产品推荐
相关产品推荐

