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
关键修改说明
- 明确指定单个文件路径:将提取后的目录路径与具体文件名拼接,作为
asset_path的值。 - 匹配正确的内容类型:为
.tgz设置application/gzip,为.iso设置application/x-iso9660-image。 - 优化版本标签:将
${{ github.ref }}改为${{ github.ref_name }},避免出现refs/heads/main这类冗余格式,直接获取分支/标签名。
内容的提问来源于stack exchange,提问作者maskeda
相关产品推荐
相关产品推荐

