GitHub Actions推送Docker时Buildx报No such file or directory错误求助
问题描述
配置GitHub Actions实现代码推送自动构建并推送Docker镜像时,工作流执行到镜像推送步骤抛出如下错误:
Error: buildx failed with: error: failed to solve: failed to compute cache key: failed to walk /var/lib/docker/tmp/buildkit-mount1164878607/target: lstat /var/lib/docker/tmp/buildkit-mount1164878607/target: no such file or directory
排查确认报错由Docker无法访问Dockerfile中指定的文件导致:完全移除COPY指令时镜像可推送成功,但构建出的镜像无法正常运行。项目使用maven-compiler-plugin与maven-shade-plugin完成打包,pom.xml配置已核对无误。
现有GitHub工作流配置
name: Docker on: [push] jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Set up JDK uses: actions/setup-java@v3.3.0 with: java-version: 18 distribution: adopt - name: Build with Maven run: mvn clean package - name: Login to DockerHub uses: docker/login-action@v2.0.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} - name: Build and push Docker images uses: docker/build-push-action@v3.0.0 with: push: true tags: sudden/discordbot:latest
现有Dockerfile配置
FROM openjdk:11-jdk-slim WORKDIR /tmp COPY target/discordbot-1.0-SNAPSHOT-shaded.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
已尝试排查方案
- 尝试复制src目录下的其他任意文件
- 修改jar包文件名与对应引用路径
- 调整WORKDIR配置参数
- 修改工作流中Docker的context等相关配置项
问题根因
docker/build-push-action@v3.0.0默认使用buildx构建,默认不会将当前运行器上前置步骤(也就是Maven打包步骤)生成的target目录纳入Docker构建上下文,Docker构建过程中根本访问不到Maven打出来的jar包,才会抛出路径不存在的错误。移除COPY指令后不需要读取上下文内的本地文件,自然可以构建成功,但镜像里没有业务jar包无法运行。
修复方案
按以下内容调整工作流配置即可解决:
- 显式添加
docker/setup-buildx-action步骤初始化buildx环境,不要依赖默认隐式配置 - 升级使用的各Action到稳定版本,避免旧版本默认配置的兼容问题
- 显式指定Docker构建上下文为项目根目录,确保buildx可以读取到Maven生成的target目录内容
- 增加校验步骤确认Maven生成的jar包路径和文件名和Dockerfile中配置的一致,避免打包配置不匹配的问题
修复后的完整工作流配置如下:
name: Docker on: [push] jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Set up JDK uses: actions/setup-java@v3 with: java-version: '18' distribution: 'adopt' - name: Build with Maven run: mvn clean package - name: Verify build output run: ls -la target/ - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to DockerHub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} - name: Build and push Docker images uses: docker/build-push-action@v4 with: context: . push: true tags: sudden/discordbot:latest
如果调整后仍然报错,核对maven-shade-plugin中配置的finalName字段,确认target目录下生成的jar包全名和Dockerfile里COPY指令写的discordbot-1.0-SNAPSHOT-shaded.jar完全一致即可。
内容的提问来源于stack exchange,提问作者Nathan Yearout
相关产品推荐
相关产品推荐

