Estoy tratando de construir mi proyecto localmente usando gitlab-runner en 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"
Desafortunadamente, mis intentos terminan con un error sobre el "inicio de sesión de Docker" que no puede realizar un inicio de sesión interactivo desde un dispositivo que no es 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
Mi pregunta es: ¿alguien se ha topado con este problema y cómo realizar la compilación con éxito?
Probablemente no esté relacionado con el problema aquí, pero algunas personas pueden encontrar exactamente el mismo mensaje al intentar docker login
desde una terminal similar a Linux en Windows, como Git bash o la terminal de inicio rápido de Docker o incluso Cygwin .
El truco aquí es usar el inicio de sesión de winpty docker login
Lo más probable es que no haya especificado las variables $CI_JOB_TOKEN
y $CI_REGISTRY
para el proyecto en el que está trabajando. Tenga en cuenta que las variables no se comparten y solo se establecen por proyecto .
Por eso también te encuentras con el mensaje de error.
"la bandera necesita un argumento: 'p' en -p"
cuando intenta iniciar sesión en la ventana acoplable sin las comillas, que es la forma correcta porque, de lo contrario $CI_JOB_TOKEN
no se reconoce como una variable, sino que es simplemente una cadena que consta de dos comillas, un signo de dólar y la secuencia de caracteres "CI_JOB_TOKEN" .
Suponiendo que sus variables no están configuradas e intenta ejecutar el comando
docker login -u "gitlab-ci-token" -p $CI_JOB_TOKEN $CI_REGISTRY
las variables se evalúan y su comando esencialmente se ve así:
docker login -u "gitlab-ci-token" -p
El indicador -p
no va seguido de una contraseña y, por ese motivo, Docker intenta inicializar un inicio de sesión interactivo.
Puede verificar esto intentando generar sus variables cuando incluye el comando echo $CI_JOB_TOKEN
en su .gitlab-ci.yml
Tuve el mismo problema, pero por una causa diferente a las que ya se enumeran aquí.
Este es mi comando gitlab-ci:
docker login "${AZURE_ACR_URL}" -u "${AZURE_ACR_ACCOUNT}" -p "${AZURE_ACR_PASSWORD}"
Mi canalización funcionaba bien en la rama maestra, pero no en otras ramas. ¿Por qué? Porque definí la variable AZURE_ACR_PASSWORD a través de la función settings/ci_cd, con el indicador "protegido". Después de leer lo que significa esta bandera protegida, entendí por qué mi variable AZURE_ACR_PASSWORD no se podía ver en el comando:
Esta variable se pasará solo a canalizaciones que se ejecutan en ramas y etiquetas protegidas