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

时间:2017-04-06 07:27:53

标签: docker gitlab

我试图在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 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 

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

12 个答案:

答案 0 :(得分:22)

可能没有与此处的问题相关联,但有些人在Windows上从类似Linux的终端尝试docker login时可能会遇到完全相同的消息,例如 Git bash Docker快速入门终端甚至 Cygwin

这里的诀窍是使用winpty docker login

答案 1 :(得分:14)

您很可能没有为您正在处理的项目指定变量$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

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

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

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

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

答案 2 :(得分:8)

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

这是我的gitlab-ci命令:

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

我的管道在master分支上运行正常,但在其他分支上运行不正常。为什么?因为我通过settings / ci_cd功能使用“保护”标志定义了AZURE_ACR_PASSWORD变量。读取此受保护标志的含义后,我了解了为什么在命令中看不到我的AZURE_ACR_PASSWORD变量的原因:

  

此变量将仅传递到在受保护的管道上运行的管道   分支机构和标签

答案 3 :(得分:1)

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

对此的一般答案是: 在命令行中查看每个参数,并确保它是您想要的。一个诀窍是在您的总体命令行前加上 echo ,以便解析所有变量...

答案 4 :(得分:1)

对于那些试图通过 gitlab-ci ssh 到远程主机以部署 docker 镜像的人:

某些变量如 $CI_DEPLOY_USER $CI_DEPLOY_PASSWORD CI_JOB_TOKEN 和其他变量没有通过 ssh 发送到远程服务器,因为它们不是共享变量。

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

然后通过 configs >> ci /cd >> variables 在项目或组上创建 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 *\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"

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

答案 5 :(得分:0)

虽然我为git-lab得到了这个错误,但我在拉出不同的图像时得到了它。 问题是在Windows上使用git bash,切换到power shell提示符,然后尝试以下操作:

 docker login

希望这有帮助

答案 6 :(得分:0)

阅读受保护的变量如何工作对我来说解决了。我需要在受保护的分支内执行此操作,因为我也保护了变量。

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

答案 7 :(得分:0)

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

ListView. builder(
        physics: ClampingScrollPhysics(),
        controller:
        _scrollControllerCategoryList,
        scrollDirection: Axis.horizontal,
        itemBuilder: (BuildContext context, int index) {
          return GestureDetector(
            onTap: () {
            },
            child: Container(
              child: Center(
                height: 60,
              child: Text(
                appConsumer.menu.keys
                    .toList()[index]
                    .baseName,
                style: TextStyle(
                    fontSize: 14,
                    color:
                    selectedCategory ==
                        index
                        ? AppTheme()
                        .green
                        : Colors
                        .grey[500]),
              ),
             ),
            ),
          );
        },
        itemCount: appConsumer.menu.keys.length,
      )

此操作与Docker登录名执行相同的操作(如果您没有docker凭据帮助器)。

答案 8 :(得分:0)

以下为 Docker 1.13 (Rhel-7.8)工作的我:

  1. 使用密码/ ECR密钥创建文件
  2. 使用命令 docker login --username AWS -p 'cat ../key' registry-url.amazonaws.com

注意: 在第二步中,请在使用命令时将'替换为`

(干杯

答案 9 :(得分:0)

对于那些使用在 GitLab CI/CD 设置中设置的变量,取消标记保护和屏蔽选项

这样就可以解决docker登录问题了。

答案 10 :(得分:-1)

如果你在这里是因为你在 git hubs 工作流程(操作)中遇到错误。最简单的登录方式是 docker login-action 步骤: 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

答案 11 :(得分:-3)

尝试一下。 docker login -u Username -p Password

对我有用。