我试图在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
我的问题是,是否有人偶然发现了这个问题以及如何成功地进行构建?
答案 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_USER
和 MASTER_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_HOST
和 YOUR_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)工作的我:
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
对我有用。