在GitHub Actions中从ECR拉取Docker镜像报错:无效引用格式
问题根源
invalid reference format 错误的核心原因是:你在ssh-action的script里使用的$ECR_REGISTRY、$ECR_REPOSITORY、$IMAGE_TAG这三个环境变量,并没有传递到EC2实例的shell会话中。这些变量只存在于GitHub Actions的运行器(ubuntu-latest)环境里,EC2机器上根本不知道它们的值,导致Docker拉取命令变成了无效格式,触发了错误。
解决步骤
1. 传递环境变量到EC2实例
修改appleboy/ssh-action步骤的配置,把需要的变量加到envs参数里,这样这些变量会被注入到EC2的shell环境中:
- name: Docker pull & run from github uses: appleboy/ssh-action@master with: host: ec2-3-86-102-151.compute-1.amazonaws.com username: ec2-user key: ${{ secrets.ACTIONS_PRIVATE_KEY }} # 把需要的环境变量加到这里,用逗号分隔 envs: GITHUB_SHA,ECR_REGISTRY,ECR_REPOSITORY,IMAGE_TAG script: | # 避免多余空格,保持命令格式规范 docker pull $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
2. 确保EC2实例能访问ECR
EC2实例需要有拉取ECR镜像的权限,并且完成登录:
- 如果EC2关联了带有
AmazonEC2ContainerRegistryReadOnly权限的IAM角色,可以在script里添加登录命令:
script: | aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $ECR_REGISTRY docker pull $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
- 优先用IAM角色方式,避免在EC2上硬编码AWS凭证。
3. 临时测试方案(不推荐长期使用)
如果只是快速验证,可以直接把变量值硬编码到命令里:
script: | docker pull 123456789012.dkr.ecr.us-east-1.amazonaws.com/githubactions:githubactions_image
额外检查点
- 可以在前面的步骤中添加
echo $ECR_REGISTRY命令,验证变量在GitHub Actions运行器中是否正确赋值。 - 确保Docker命令里的变量引用没有多余空格,避免格式问题。
内容的提问来源于stack exchange,提问作者Vamsi
相关产品推荐
相关产品推荐

