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

asd*_*fgh 34 gitlab docker

我正在尝试使用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"
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的尝试以"docker login"无法从非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 
Run Code Online (Sandbox Code Playgroud)

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

Vic*_*tit 37

可能没有链接到这里的问题,但有些人可能会遇到完全相同的消息docker login从Windows上的Linux类终端尝试,如Git bashDocker快速启动终端甚至Cygwin.

这里的诀窍是使用 winpty docker login


Den*_*nis 20

您很可能没有指定变量$CI_JOB_TOKEN以及$CI_REGISTRY您正在处理的项目.请注意,变量不是共享的,只是按项目设置!

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

"flag需要一个参数:'p'在-p中"

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

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

docker login -u "gitlab-ci-token" -p $CI_JOB_TOKEN $CI_REGISTRY
Run Code Online (Sandbox Code Playgroud)

评估变量,你的命令基本上是这样的:

docker login -u "gitlab-ci-token" -p
Run Code Online (Sandbox Code Playgroud)

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

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


Fab*_*adi 14

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

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

  • 这是一个被低估的答案。 (2认同)

小智 11

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

这是我的gitlab-ci命令:

docker login "${AZURE_ACR_URL}" -u "${AZURE_ACR_ACCOUNT}" -p "${AZURE_ACR_PASSWORD}"
Run Code Online (Sandbox Code Playgroud)

我的管道在主分支上运行正常,但在其他分支上运行不正常.为什么?因为我通过settings/ci_cd功能定义了AZURE_ACR_PASSWORD变量,带有"protected"标志.在阅读了这个受保护的标志意味着我理解为什么在命令中看不到我的AZURE_ACR_PASSWORD变量之后:

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


小智 8

阅读受保护的变量如何工作为我解决了这个问题。我需要在受保护的分支内执行此操作,因为我还保护了我的变量。

如果您没有使用受保护的分支,最好删除受保护的变量并重试。


Hel*_*cos 5

For those who are trying to ssh to a remote host for deploying a docker image via gitlab-ci:

Some variables like $CI_DEPLOY_USER $CI_DEPLOY_PASSWORD CI_JOB_TOKEN and others are not been sent through ssh to the remote server because they are not shared vars.

You need to create a deploy token via config >> repository >> deploy token. This applies for your group or for a specific project.

Then create 2 variables on the project or group via configs >> ci /cd >> variables. The names could be MASTER_DEPLOY_USER and MASTER_DEPLOY_TOKEN

Then you could login like following

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 *\n\tStrictHostKeyChecking no\n\n" > ~/.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"
Run Code Online (Sandbox Code Playgroud)

Make sure you define also the other needed variables like YOUR_REMOTE_HOST and YOUR_SERVER_SSH_PRIV_KEY.