GitHub Actions中Docker镜像以SHA标签推送失败求助
以下是针对你遇到的denied: requested access to the resource is denied错误的排查和解决步骤:
检查Docker登录凭据的有效性与权限
确保GitHub Actions中使用的Docker仓库登录凭据(用户名/Token)正确且未过期,并且该账号拥有目标镜像仓库的推送权限。比如使用docker/login-action的配置要完整:- name: 登录Docker仓库 uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }}如果是私有仓库,还要确认该账号已被添加到仓库的权限列表中,拥有推送权限。
确保镜像标签是完整的仓库引用格式
不能直接将tags设置为单独的${{ github.sha }},必须带上完整的仓库前缀和镜像名,格式为[仓库用户名/组织名]/[镜像名]:[SHA]。比如在matrix构建中:- name: 构建并推送镜像 uses: docker/build-push-action@v5 with: context: ./${{ matrix.image-dir }} push: true tags: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.image-name }}:${{ github.sha }}之前用
latest标签时可能是完整格式,换SHA时遗漏了仓库前缀,导致推送的镜像名不合法,触发权限拒绝。验证matrix构建中标签的拼接逻辑
检查matrix变量(比如image-name、image-dir)是否正确传递,确保每个镜像的标签都能拼接成合法的完整路径。可以添加一个调试步骤输出最终标签:- name: 输出镜像标签 run: echo "镜像标签:${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.image-name }}:${{ github.sha }}"确认GitHub SHA变量的正确性
在部分事件(比如Pull Request)中,github.sha可能指向基础分支的哈希,而非PR分支的。如果是这种场景,可以改用github.event.pull_request.head.sha获取PR分支的提交哈希:tags: ${{ secrets.DOCKER_HUB_USERNAME }}/${{ matrix.image-name }}:${{ github.event.pull_request.head.sha }}也可以添加步骤输出SHA值,确认是否符合预期:
- name: 输出当前SHA run: echo "当前提交SHA:${{ github.sha }}"核对仓库命名空间与登录账号的一致性
确保镜像标签中的仓库用户名/组织名,与登录Docker仓库时使用的账号完全一致。比如登录的是myorg,但标签写的是otherorg/my-image,就会因权限不足被拒绝。
内容的提问来源于stack exchange,提问作者Niranjan godbole

