You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action上传Docker导出制品为Release时遇EISDIR错误求助

解决GitHub Action上传Docker提取目录作为Release制品的错误

问题场景

在GitHub Action中构建Docker容器后,从容器内/export目录复制出blah.tgz和blah.iso文件,尝试将这两个文件上传为GitHub Release时,执行过程抛出错误:

Run actions/upload-release-asset@v1
  with:
    upload_url: https://uploads.github.com/repos/blah/blah/releases/97404561/assets{?name,label}
    asset_path: .extracted-1680133372939
    asset_name: .extracted-1680133372939
    asset_content_type: application/zip
  env:
    GITHUB_TOKEN: ***
  
Error: EISDIR: illegal operation on a directory, read

错误原因

  • shrink/actions-docker-extract提取的是整个/export目录,输出的destination是目录路径,而actions/upload-release-asset@v1仅支持上传单个文件,无法读取目录,因此触发EISDIR错误。
  • 原配置中直接将目录名作为asset_name,不符合制品命名规范;同时统一设置application/zip作为内容类型,不适用于.iso文件。

解决方案

方案一:使用更简洁的工具链上传多文件

推荐使用softprops/action-gh-release,该工具可同时完成Release创建和多文件上传,配置更简洁:

name: build
on:
  push:
    branches:
    - main
jobs:
  extract_images_from_docker_build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Login to GitHub Container Registry
      uses: docker/login-action@v2
      with:
        registry: ghcr.io
        username: ${{ github.repository_owner }}
        password: ${{ secrets.GHCR_PAT }}
    - name: Build the Docker image
      run: docker build -t ghcr.io/image/build:latest -f docker/Dockerfile .
    - uses: shrink/actions-docker-extract@v2
      id: extract
      with:
        image: ghcr.io/image/build:latest
        path: /export/.
    - name: Create Release and Upload Assets
      uses: softprops/action-gh-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{ github.ref_name }}
        name: Release ${{ github.ref_name }}
        body: |
          Changes in this Release
          - Initial alpha release
        draft: true
        prerelease: true
        files: |
          ${{ steps.extract.outputs.destination }}/blah.tgz
          ${{ steps.extract.outputs.destination }}/blah.iso

方案二:保留原工具链,分两次上传单个文件

如果需要沿用原有的create-release和upload-release-asset组合,可分两次步骤分别上传两个文件:

name: build
on:
  push:
    branches:
    - main
jobs:
  extract_images_from_docker_build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Login to GitHub Container Registry
      uses: docker/login-action@v2
      with:
        registry: ghcr.io
        username: ${{ github.repository_owner }}
        password: ${{ secrets.GHCR_PAT }}
    - name: Build the Docker image
      run: docker build -t ghcr.io/image/build:latest -f docker/Dockerfile .
    - uses: shrink/actions-docker-extract@v2
      id: extract
      with:
        image: ghcr.io/image/build:latest
        path: /export/.
    - name: Create Release
      id: create_release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        tag_name: ${{ github.ref_name }}
        release_name: Release ${{ github.ref_name }}
        body: |
          Changes in this Release
          - Initial alpha release
        draft: true
        prerelease: true
    - name: Upload TGZ Asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ${{ steps.extract.outputs.destination }}/blah.tgz
        asset_name: blah.tgz
        asset_content_type: application/gzip
    - name: Upload ISO Asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create_release.outputs.upload_url }}
        asset_path: ${{ steps.extract.outputs.destination }}/blah.iso
        asset_name: blah.iso
        asset_content_type: application/x-iso9660-image

关键修改说明

  1. 明确指定单个文件路径:将提取后的目录路径与具体文件名拼接,作为asset_path的值。
  2. 匹配正确的内容类型:为.tgz设置application/gzip,为.iso设置application/x-iso9660-image。
  3. 优化版本标签:将${{ github.ref }}改为${{ github.ref_name }},避免出现refs/heads/main这类冗余格式,直接获取分支/标签名。

内容的提问来源于stack exchange,提问作者maskeda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:14:56