Gitlab-runner 本地构建 - 从非 TTY 设备登录



我正在尝试在Linux上使用gitlab-runner在本地构建我的项目。

docker-build:
stage: build
image: docker:latest
script:
- docker login -u "gitlab-ci-token" -p "$CI_JOB_TOKEN" $CI_REGISTRY # user "gitlab-ci-token" is automatically created by GitLab
- docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME" target/
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME"

不幸的是,我的尝试以"docker 登录"无法从非 TTY 设备执行交互式登录的错误告终。

$ gitlab-ci-multi-runner exec docker --docker-privileged docker-build
Running with gitlab-ci-multi-runner 1.11.1 (a67a225)
on  ()
Using Docker executor with image docker:latest ...
Starting service docker:dind ...
Pulling docker image docker:dind ...
Waiting for services to be up and running...
Pulling docker image docker:latest ...
Running on runner--project-1-concurrent-0 via vanqyard...
Cloning repository...
Cloning into '/builds/project-1'...
done.
Checking out 70187b2d as docker-basic-conf...
Skipping Git submodules setup
Checking cache for docker-build/docker-basic-conf...
Successfully extracted cache
$ docker login -u "gitlab-ci-token" -p "$CI_JOB_TOKEN" $CI_REGISTRY
Error: Cannot perform an interactive login from a non TTY device
ERROR: Job failed: exit code 1
FATAL: exit code 1 

我的问题是有没有人偶然发现了这个问题以及如何成功执行构建?

可能与这里的问题无关,但是有些人在尝试从Windows上的Linux终端(如Git bashDocker快速入门终端甚至Cygwin)尝试docker login时可能会遇到完全相同的消息。

这里的诀窍是使用winpty docker login

很可能您没有为您正在处理的项目指定变量$CI_JOB_TOKEN$CI_REGISTRY。请注意,变量不是共享的,并且仅按项目设置!

这也是您遇到错误消息的原因

"标志需要一个参数:-p 中的"p">

当您尝试在没有引号的情况下进行 Docker 登录时,这是正确的方法,因为否则$CI_JOB_TOKEN不会被识别为变量,而它只是一个由两个引号、一个美元符号和字符序列"CI_JOB_TOKEN"组成的字符串。

假设您的变量未设置,并且您尝试执行命令

docker login -u "gitlab-ci-token" -p $CI_JOB_TOKEN $CI_REGISTRY

变量被计算,你的命令基本上看起来像这样:

docker login -u "gitlab-ci-token" -p

-p标志后面没有密码,因此 docker 尝试初始化交互式登录。

您可以通过在 .gitlab-ci.yml 中包含命令echo $CI_JOB_TOKEN时尝试输出变量来验证这一点

我遇到了同样的问题,但原因与此处已经列出的原因不同。

这是我的 gitlab-ci 命令:

docker login "${AZURE_ACR_URL}" -u "${AZURE_ACR_ACCOUNT}" -p "${AZURE_ACR_PASSWORD}"

我的管道在主分支上运行良好,但在其他分支上运行不正常。为什么?因为我通过设置/ci_cd功能定义了AZURE_ACR_PASSWORD变量,带有"受保护"标志。在阅读了这个受保护的标志的含义后,我明白了为什么在命令中看不到我的AZURE_ACR_PASSWORD变量:

此变量将仅传递给在受保护上运行的管道 分支和标记

错误:无法从非 TTY 设备执行交互式登录是您典型的红鲱鱼消息。 你必须超越信息,或者更确切地说,在之前。它希望使用交互式登录作为回退解决方案,因为上一次登录失败。就像在Unix中,当你的ssh2身份验证尝试被拒绝时一样。然后,它会提示输入用户名/密码。除了模拟Unix终端,它可能会失败。

对此的一般答案是: 在命令行中查看每个参数,并确保它是您认为的。一个技巧是在整个命令行前面加上echo,以便解析所有变量......

阅读受保护变量的工作原理为我解决了这个问题。我需要在受保护的分支中执行此操作,因为我也保护了我的变量。

如果不使用受保护的分支,最好删除受保护的变量,然后重试。

对于那些尝试通过 gitlab-ci 将 ssh 连接到远程主机以部署 docker 映像的用户:

某些变量(如$CI_DEPLOY_USER$CI_DEPLOY_PASSWORDCI_JOB_TOKEN和其他变量)不会通过 ssh 发送到远程服务器,因为它们不是共享变量。

您需要通过配置>>存储库创建部署令牌>>部署令牌。这适用于您的小组或特定项目。

然后通过 ci/cd>>变量>>配置在项目或组上创建 2 个变量。名称可以是MASTER_DEPLOY_USERMASTER_DEPLOY_TOKEN

然后你可以像下面一样登录

deploy-development:
stage: deploy-development
image: kroniak/ssh-client
only:
- my_development_branch
before_script:
- eval $(ssh-agent -s)
- echo "$YOUR_SERVER_SSH_PRIV_KEY" | tr -d 'r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config'
script:
- ssh-keygen -R $YOUR_REMOTE_HOST || true
# login to docker on auth machine with deploy credentials
- >
ssh root@${YOUR_REMOTE_HOST}
"docker login -u $MASTER_DEPLOY_USER -p $MASTER_DEPLOY_TOKEN $CI_REGISTRY"

确保还定义了其他所需的变量,例如YOUR_REMOTE_HOSTYOUR_SERVER_SSH_PRIV_KEY

对于那些使用在 GitLab CI/CD 设置中设置的变量的用户,取消标记受保护和屏蔽的选项。 或者,只需取消标记受保护即可正常工作,而无需未选中屏蔽。

这将解决码头工人登录问题。

如果您只需要登录一个注册表,则可以获取令牌(在控制台登录后查看 .docker/config.json,或者在 Artifactory 的情况下有时通过注册表本身)。然后将结果回显到 .docker/config.json

echo '{ "auths": { "https://awesome_docker_repsitory.com": { "auth": "c4ajLWdpqGxhYi3xYsQ6qVa4aUefY0xbd1t6dtc4YnQ3y2DYTDoOWONx", "email": "bitbucket@foo.bar" } } }' > ~/.docker/config.json"

这将执行与 docker 登录相同的操作(如果您没有 docker 凭据帮助程序)。

将这段代码用于您的 docker 登录:

echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin

CI脚本在 docker 登录时失败。检查您的脚本是否可以访问$variables。

此问题可能是由于受保护与不受保护的分支和变量关联。

感谢Pievee和Greg-Witczak

我从变量中删除了保护。

下面为我工作了Docker 1.13( Rhel-7.8

):
  1. 使用您的密码/ECR 密钥创建一个文件
  2. 使用命令docker login --username AWS -p 'cat /data/user/ecr/key' registry-url.amazonaws.com

注意:在步骤2中,请在使用命令时将'替换为'

虽然我没有在 git-lab 上收到此错误,但我在拉取不同的图像时得到了它。

问题在于在Windows上使用git bash。切换到PowerShell提示符,然后尝试以下操作:

docker login

<</div> div class="one_answers">就我而言,我试图连接到AWS-Repo。

aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/XYZ

阅读其他答案后,我只是运行了命令的第一部分:

aws ecr-public get-login-password --region us-east-1

这导致了一个新的错误:

"...is not authorized to perform: sts:GetServiceBearerToken..."

此错误消息用作密码,因此不起作用。因此,不要被错误误导并寻找根本原因。

对于 AWS 用户: 我添加了以下两个权限:

AWSKeyManagementServicePowerUser, AWSCodeArtifactAdminAccess

就我而言,'让变量不起作用

ssh xxx@xxx 'docker login ${REGISTRY} -u ${REGISTRY_USER} -p ${REGISTRY_PASSWORD} && dosomething' 

因此,您不应该使用'。有很多方法可以达到它。

如果你在这里是因为你在 Git Hub 工作流(操作)中收到错误。 最简单的登录方法是 docker 登录操作步骤: https://github.com/marketplace/actions/docker-login#github-packages-docker-registry

-   name: Login to GitHub Packages Docker Registry
uses: docker/login-action@v1
with:
registry: docker.pkg.github.com
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

或者对于 Windows 生成代理:

-   name: Login
shell: pwsh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: echo $env:GITHUB_TOKEN | docker login https://docker.pkg.github.com -u ${env:GITHUB_ACTOR} --password-stdin

试试这个。docker login -u Username -p Password

它对我有用。

相关内容

  • 没有找到相关文章

最新更新