Skip to content

Docker Scout と GitLab CI を連携する

この例では、Docker イメージの定義とコンテンツを含むリポジトリ内で、GitLab CIを使用してパイプラインを実行します。コミットによってトリガーされ、パイプラインはイメージをビルドします。デフォルトブランチへのコミットの場合は、Docker Scout を使用して CVE レポートを取得します。別のブランチへのコミットの場合は、新しいバージョンを現在公開されているバージョンと比較します。

手順

最初に、ワークフロー全体を設定します。これは Docker Scout に特有ではありませんが、比較するためのイメージを作成するために必要です。

リポジトリのルートにある .gitlab-ci.yml ファイルに、以下の内容を追加してください。

docker-build:
  image: docker:latest
  stage: build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
 
    # curlとDocker Scout CLIをインストール
    - |
      apk add --update curl
      curl -sSfL https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh -s -- 
      apk del curl 
      rm -rf /var/cache/apk/*
    # Docker Hubへのログインが必要です
    - docker login -u "$DOCKER_HUB_USER" -p "$DOCKER_HUB_PAT"

これにより、コンテナ内で Docker を実行するための Docker-in-Docker モードを使用してDockerイメージをビルドするワークフローが設定されます。 次に、curl と Docker Scout CLI プラグインをダウンロードし、リポジトリの設定に定義された環境変数を使用して Docker レジストリにログインします。

次に、YAML ファイルに以下の内容を追加してください。

script:
  - |
    if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
      tag=""
      echo "デフォルトブランチ '$CI_DEFAULT_BRANCH' で実行中: tag = 'latest'"
    else
      tag=":$CI_COMMIT_REF_SLUG"
      echo "ブランチ '$CI_COMMIT_BRANCH' で実行中: tag = $tag"
    fi
  - docker build --pull -t "$CI_REGISTRY_IMAGE${tag}" .
  - |
    if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
      # ビルドされたイメージのCVEレポートを取得し、重大または高優先度のCVEが検出された場合にパイプラインを失敗させる
      docker scout cves "$CI_REGISTRY_IMAGE${tag}" --exit-code --only-severity critical,high    
    else
      # ブランチのイメージとデフォルトブランチの最新イメージを比較し、新しい重大または高優先度のCVEが検出された場合にパイプラインを失敗させる
      docker scout compare "$CI_REGISTRY_IMAGE${tag}" --to "$CI_REGISTRY_IMAGE:latest" --exit-code --only-severity critical,high --ignore-unchanged
    fi
 
  - docker push "$CI_REGISTRY_IMAGE${tag}"

これにより、先に述べたフローが作成されます。デフォルトブランチへのコミットの場合、Docker Scoutは CVE レポート を生成します。別のブランチへのコミットの場合、新しいバージョンを現在の公開バージョンと比較します。表示されるのは重大または高優先度の脆弱性のみで、前回の分析以降に変更のない脆弱性は無視されます。

最後に、YAML ファイルに以下の内容を追加してください。

rules:
  - if: $CI_COMMIT_BRANCH
    exists:
      - Dockerfile

これにより、コミットに Dockerfile が含まれている場合と CI ブランチへのコミットである場合にのみ、パイプラインが実行されるようになります。

ビデオ解説