GitHub Actions推送Docker镜像到DockerHub报访问被拒绝解决方法
问题排查与修复指引
你遇到的denied: requested access to the resource is denied报错由多个配置错误共同导致,按以下顺序排查修复即可:
1. 修复无效的Docker登录步骤
你当前的登录逻辑完全没有生效:
- 环境变量里定义的密钥名是
DOCKER_USERNAME/DOCKER_PASSWORD,实际命令里引用的却是secrets.DOCKER_PASS/secrets.DOCKER_USER,密钥名不匹配会导致传入空值 - 登录命令整体被双引号包裹,实际执行时只会把整串文本打印到控制台,不会执行管道登录操作,等于推送前根本没有完成DockerHub认证
- 注意:DockerHub 2022年之后就不支持账号密码直接做CLI登录了,需要先去DockerHub后台生成具备仓库读写权限的Personal Access Token,把这个Token作为密码存在GitHub Secrets里使用
正确的登录步骤写法:
- name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login docker.io -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
2. 修正镜像命名规则
从报错日志里的The push refers to repository [docker.io/${{IMAGE_NAME}}]可以看出,你配置的镜像名变量没有被正确解析,同时不符合DockerHub的推送命名要求:
- DockerHub要求所有用户推送的镜像必须带账号名前缀,格式为
你的DockerHub用户名/镜像名,比如DockerHub账号是demo123,镜像叫webapp,那镜像名必须是demo123/webapp。不带前缀的镜像会被识别为Docker官方镜像,普通用户没有推送权限 - 你存到GitHub Secrets里的
IMAGE_NAME必须严格符合上述命名格式,不能只写镜像名 - 你现有配置里的
Tag the image to latest步骤是完全多余的,自己给镜像打同名tag没有任何意义,可以直接删除 - 推送镜像时必须明确指定tag,不要省略
:latest,避免路径识别错误
3. 校验Secrets配置
到GitHub仓库的Settings -> Secrets and variables -> Actions页面,确认以下三个Secrets存在且值正确:
DOCKER_USERNAME:你的DockerHub登录用户名,不是绑定邮箱DOCKER_PASSWORD:DockerHub生成的具备读写权限的Personal Access Token,不是账号登录密码IMAGE_NAME:格式为DockerHub用户名/自定义镜像名,例如demo123/webapp
修正后的完整工作流步骤参考
steps: - uses: actions/checkout@v3 - name: Log in to Docker Hub run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login docker.io -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin - name: Build Docker image run: docker build . --file Dockerfile --tag ${{ secrets.IMAGE_NAME }}:latest - name: Push image to Docker Hub run: docker push ${{ secrets.IMAGE_NAME }}:latest
如果你的DockerHub仓库是私有仓库,额外确认使用的Token对该私有仓库有推送权限即可;公开仓库第一次推送时会自动创建对应仓库,不需要提前手动新建。
内容的提问来源于stack exchange,提问作者user15830384
相关产品推荐
相关产品推荐

