Местная сборка 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
Это сработало для меня.