web-dev-qa-db-ja.com

CIのベースイメージとしてGitlabレジストリのプライベートDockerイメージを使用する

Gitlabレジストリのイメージを別のCIビルドのベースイメージとして使用する場合、どのように認証する必要がありますか?

https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#using-a-privateによると-docker-registry 最初にランナーマシンに手動でログインする必要があります。どういうわけか、既存のGitlabユーザーでログインするのは奇妙に感じます。

認証にCI変数「CI_BUILD_TOKEN」(「GitLabコンテナレジストリでの認証に使用されるトークン」として説明されています)を使用して、Gitlabレジストリからベースイメージをプルする方法はありますか?

編集:私は公共プロジェクトからの画像を使用できることを知りました。しかし、Dockerプロジェクトを公開したくはありません。

更新:Gitlab 8.14以降、ビルドインドッカーレジストリのドッカーイメージを使用できます。 https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#support-for-gitlab-を参照してください統合レジストリ

11
Martin Sadowski

いいえ、これは現在、エレガントな方法では不可能です。 GitLabは、ベースイメージの明示的な認証情報を実装する必要があります。これは、最も簡単で正しいソリューションになります。

GitLabRunnerマシンでdocker loginする必要があります。 gitlab-ci-tokenは有効期限が切れており、プロジェクトに依存しているため、使用できません。したがって、プロジェクトごとに1つのトークンを実際に使用することはできません。独自のログインを使用することは、現在利用可能なほとんど唯一の解決策です(これで修正されてうれしいです)。

今では可能です、彼らは数ヶ月前にそのオプションを含めました。

使用する gitlab-ci-tokenasユーザーおよび変数$CI_BUILD_TOKENパスワードとして。

この例はGitLab8.13.6で動作します。必要に応じてテストイメージを作成し、次の段階でそれを使用して構文チェックを実行します。

build_test:
  stage: build_test_image
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:test -f dockerfiles/test/Dockerfile .
    - docker Push $CI_REGISTRY_IMAGE:test
  tags:
    - docker_build
  environment: test

test_syntax:
  image: $CI_REGISTRY_IMAGE:test
  stage: test
  script:
    - flake8 --ignore=E501,E265,E402 .

更新:質問を読み直すと、受け入れられた答えは正しいです。私の例では、ジョブtest_syntaxは、ユーザーがランナーマシンから手動でログインしない限り、レジストリへの認証に失敗します。ただし、2人のランナーが同じホスト上にいる場合は機能しますが、とにかく最善の解決策ではありません。

gitlab-ci-multi-runner 1.8 には、レジストリ資格情報を変数として追加するオプションがあるため、エンコードされた資格情報を取得するには、一度ログインするだけで済みます。 ドキュメント を参照してください。

6
charli

これは2018年9月の時点で絶対に可能です。ここに私の素朴な実装を投稿します。

環境:

  • docker:dindサービスを利用する必要があります。これにより、Dockerコンテナー内でdockerコマンドを実行できます。
  • これには、有効なdocker loginを使用する必要があります。これは、GitLabの組み込み変数(gitlab-ci-token$CI-JOB-TOKEN)を使用して実行できます。
  • これで、リポジトリのレジストリ(例$REGISTRY値:registry.gitlab.com/$USER/$REPO:$TAG)に対して認証できるようになります。これにより、CI/CDコンテキスト内および任意の場所からDockerコンテナをプッシュまたはプルできます。認証されたDockerサーバー。

実装:

このブロックをトップレベルで作成して、次のジョブの前に実行されるようにします。

before_script: 
        - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $REGISTRY

イメージをビルドしてレジストリに保存するジョブ:

build_container:
    image: docker:latest
    stage: build
    services:
        - docker:dind
    script:
        - docker build -t $REGISTRY .
        - docker Push $REGISTRY

カスタム画像を使用するジョブ:

build_app:
    image: $REGISTRY
    stage: deploy
    script:
        - npm run build

クロスレポジョブについて:

これを実現するには、「ボット」GitLabユーザーを作成し、必要に応じてリポジトリ/グループへのアクセスを割り当てます。次に、gitlab-ci-token$CI_JOB_TOKENを適切な環境変数に置き換えるだけです。これは、ベースイメージがプライベートである場合にのみ必要です。

2
Chris Vincent

最初に、使用するイメージのgitlabコンテナーレジストリにログインする必要がある可能性があります。以下の例を参照してください。画像を使用する前に基本的に認証を行うbefore_script:に注意してください。

image: docker:latest
services:
- docker:dind

stages:
- build

variables:
  CONTAINER_RELEASE_IMAGE: registry.gitlab.com/obonyojimmy/node-mono-clr:latest

before_script:
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com

build-app:
  stage: build
  image: CONTAINER_RELEASE_IMAGE
  script:
    - npm run build
1