Bitbucket Pipeline推送镜像至Docker Hub遇问题求助
问题描述
我编写了如下的bitbucket-pipelines.yml文件,在通过Bitbucket Pipeline将镜像推送至Docker Hub的过程中遇到问题:
image: atlassian/default-image:2 pipelines: branches: master: - step: name: Build And Publish To Azure services: - docker script: #Authenticate on Azure - docker login -u $AZURE_USER -p $AZURE_PASS myticket.azurecr.io #Build Docker Image - docker build -t myticket.azurecr.io/myticket . #Push to Azure - docker push myticket.azurecr.io/myticket - step: name: Push To Docker Hub services: - docker script: - docker logout #Authenticate on Docker #The below says Error: Cannot perform an interactive login from a non TTY device - docker login --username $DOCKER_HUB_USERNAME --password-stdin $DOCKER_HUB_PASSWORD #The below says invalid username or password # - echo $DOCKER_HUB_PASSWORD | docker login --username $DOCKER_HUB_USERNAME --password-stdin #Build Docker Image - docker build -t myticket.azurecr.io/myticket . #Push to Docker Hub - docker push isaachats/myticket:latest
执行Docker Hub登录命令时遇到两个问题:
- 直接用
--password-stdin参数时报错:Error: Cannot perform an interactive login from a non TTY device - 用
echo管道传递密码时提示:invalid username or password
尝试添加hub.docker.com到登录命令中也没解决问题,请问哪里操作有误?
错误分析与解决方法
1. 第一个登录命令的用法错误
docker login --password-stdin的作用是从标准输入读取密码,不是把密码作为命令参数直接跟在后面。你当前的写法把$DOCKER_HUB_PASSWORD当成了Docker仓库地址,Docker会尝试连接这个地址并弹出交互式登录,而Pipeline环境是非TTY的,所以报错。正确写法是把密码通过管道传给这个命令。
2. "无效用户名或密码"的可能原因
- 环境变量未正确配置:检查Bitbucket仓库的「Repository settings > Repository variables」里,
DOCKER_HUB_USERNAME和DOCKER_HUB_PASSWORD是否正确设置,注意变量名大小写,且密码不要有多余空格。 - Docker Hub账号开启了两步验证:如果开启了两步验证,不能直接用登录密码,需要在Docker Hub账号设置里生成个人访问令牌(Personal Access Token),用这个令牌代替密码作为
DOCKER_HUB_PASSWORD的值。 - echo命令的换行符问题:有些环境下
echo会自动添加换行符,导致密码多了一个换行,无法验证。可以用echo -n来避免添加换行。
3. 镜像标签错误
你在Push到Docker Hub的步骤里,build的镜像标签还是Azure容器注册表的地址myticket.azurecr.io/myticket,但push的是isaachats/myticket:latest,这会导致Docker找不到对应的本地镜像,应该修改build命令的标签为Docker Hub的仓库名:
docker build -t isaachats/myticket:latest .
修正后的完整Pipeline脚本
image: atlassian/default-image:2 pipelines: branches: master: - step: name: Build And Publish To Azure services: - docker script: # 登录Azure容器注册表 - docker login -u $AZURE_USER -p $AZURE_PASS myticket.azurecr.io # 构建并推送Azure镜像 - docker build -t myticket.azurecr.io/myticket . - docker push myticket.azurecr.io/myticket - step: name: Push To Docker Hub services: - docker script: - docker logout # 登录Docker Hub(用-n避免换行符) - echo -n $DOCKER_HUB_PASSWORD | docker login --username $DOCKER_HUB_USERNAME --password-stdin # 构建Docker Hub镜像 - docker build -t isaachats/myticket:latest . # 推送至Docker Hub - docker push isaachats/myticket:latest
内容的提问来源于stack exchange,提问作者Isaac Hatilima
相关产品推荐
相关产品推荐

