Местная сборка Gitlab-runner - вход с устройства без TTY

Я пытаюсь создать свой проект локально с помощью gitlab-runner в Linux.

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 

Мой вопрос: кто-нибудь наткнулся на эту проблему и как успешно выполнить сборку?

Ответ 1

Вероятно, это не связано с проблемой, но некоторые люди могут столкнуться с тем же самым сообщением при попытке docker login в docker login из Linux-терминала в Windows, такого как Git bash или Docker quickstart terminal или даже Cygwin.

Трюк здесь заключается в том, чтобы использовать winpty docker login

Ответ 2

Скорее всего, вы не указали переменные $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 не сопровождается паролем, и по этой причине докер пытается инициализировать интерактивный вход в систему.

Вы можете проверить это, пытаясь вывести свои переменные, когда вы включаете команду echo $CI_JOB_TOKEN в свой.gitlab-ci.yml

Ответ 3

У меня была такая же проблема, но по другой причине, чем те, которые уже перечислены здесь.

Это моя команда gitlab-ci:

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

Мой конвейер отлично работал на главной ветке, но не на других ветвях. Зачем? Потому что я определил переменную AZURE_ACR_PASSWORD с помощью функции settings/ci_cd с "защищенным" флагом. Прочитав, что означает этот защищенный флаг, я понял, почему переменная AZURE_ACR_PASSWORD не может быть замечена в команде:

Эта переменная будет передаваться только для конвейеров, работающих на защищенных ветвях и тегах

Ответ 4

Хотя я не получил эту ошибку для git-lab, я получил ее, потянув другое изображение. Проблема заключалась в использовании git bash в Windows, переключении в командную строку Power Shell, а затем попробуйте следующее:

 docker login

Ответ 5

Попробуй это. docker login -u Username -p Password

Это сработало для меня.