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
私の質問は、誰かがこの問題につまずいていて、ビルドをうまく実行する方法ですか?
おそらくここの問題とは関係ありませんが、一部の人々はdocker login
Git bashやDockerクイックスタート端末、さらにはCygwinなどのWindows上のLinuxのような端末から。
ここでのコツは、winpty docker login
ほとんどの場合、作業中のプロジェクトの変数$CI_JOB_TOKEN
および$CI_REGISTRY
を指定しなかった可能性があります。変数は共有されないであり、プロジェクトごとに設定される!
また、エラーメッセージが表示される理由でもあります
「フラグには引数が必要です: 'p' in -p」
引用符なしでdocker loginを実行しようとすると、これが正しい方法ですなぜなら、そうでない場合は$CI_JOB_TOKEN
は変数として認識されませんが、2つの引用符で構成される単なる文字列です。ドル記号と一連の文字「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
を含めるときに変数を出力してみます。
私は同じ問題を抱えていましたが、ここに既にリストされているものとは異なる原因のためです。
これは私のgitlab-ciコマンドです:
docker login "${Azure_ACR_URL}" -u "${Azure_ACR_ACCOUNT}" -p "${Azure_ACR_PASSWORD}"
私のパイプラインはmasterブランチで正常に実行されていましたが、他のブランチでは正常に実行されていませんでした。どうして? 「protected」フラグを使用して、settings/ci_cd機能を介してAzure_ACR_PASSWORD変数を定義したためです。この保護されたフラグの意味を読んだ後、コマンドでAzure_ACR_PASSWORD変数が表示されない理由を理解しました。
この変数は、保護されたブランチとタグで実行されているパイプラインにのみ渡されます
Git-labでこのエラーを取得しましたが、別の画像をプルしているときに取得しました。問題は、Windowsでgit bashを使用し、電源シェルプロンプトに切り替えてから、次のことを試してみました。
docker login