web-dev-qa-db-ja.com

gcloudクライアントなしでGoogleコンテナーレジストリにアクセスする

コンテナーの実行を開始するCoreOS dockerホストがありますが、dockerコマンドを使用してgoogleコンテナープライベートレジストリからイメージを取得しようとすると( https://cloud.google.com/tools/ container-registry / )、403を取得します。検索を行いましたが、認証を添付する方法(またはdocker loginコマンドで使用するuser + passバンドルを生成する場所)がわかりません。

誰かがグーグルのプライベートコンテナから運を引き出したことがありますか? coreosにはPythonが付属していないため、gcloudコマンドをインストールできません。これは要件です

docker run -p 80:80 gcr.io/prj_name/image_name
Unable to find image 'gcr.io/prj_name/image_name:latest' locally
Pulling repository gcr.io/prj_name/image_name
FATA[0000] HTTP code: 403

更新:@mattmoorと@Jesseから回答を得た後:

私が引っ張っているマシンにはdevaccessがあります

curl -H 'Metadata-Flavor: Google' http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/scopes
https://www.googleapis.com/auth/bigquery
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/compute
https://www.googleapis.com/auth/datastore
----> https://www.googleapis.com/auth/devstorage.read_only
https://www.googleapis.com/auth/logging.admin
https://www.googleapis.com/auth/sqlservice.admin
https://www.googleapis.com/auth/taskqueue
https://www.googleapis.com/auth/userinfo.email

さらに、_tokenログインメソッドを使用してみました

jenkins@riskjenkins:/home/andre$ ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' 'http://metadata.google.internal./computeMetadata/v1/instance/service-accounts/default/token' | cut -d'"' -f 4)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   142  100   142    0     0  14686      0 --:--:-- --:--:-- --:--:-- 15777
jenkins@riskjenkins:/home/andre$ echo $ACCESS_TOKEN
**************(redacted, but looks valid)
jenkins@riskjenkins:/home/andre$ docker login -e [email protected] -u _token -p $ACCESS_TOKEN http://gcr.io
Login Succeeded
jenkins@riskjenkins:/home/andre$ docker run gcr.io/prj_name/image_name
Unable to find image 'gcr.io/prj_name/image_name:latest' locally
Pulling repository gcr.io/prj_name/image_name
FATA[0000] HTTP code: 403
30
Andre

Google Container Registryの認証スキームは、単に次のものを使用することです。

username: '_token'
password: {oauth access token}

Google Compute Engineでは、without gcloudでログインできます:

$ METADATA=http://metadata.google.internal./computeMetadata/v1
$ SVC_ACCT=$METADATA/instance/service-accounts/default
$ ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token \
    | cut -d'"' -f 4)
$ docker login -e [email protected] -u '_token' -p $ACCESS_TOKEN https://gcr.io

{asia、eu、us、b} .gcr.ioの更新

ローカライズされたリポジトリでホストされているリポジトリにアクセスするには、上記のdocker loginコマンドで適切なホスト名にログインする必要があります。

_ tokenを囲む引用符の更新

Dockerバージョン1.8の時点では、dockerログインにはqoutesであるか文字で始まる-uオプションが必要です。

診断のヒント...

次の方法でCloud Storageスコープがあることを確認します。

$ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/scopes
...
https://www.googleapis.com/auth/devstorage.full_control
https://www.googleapis.com/auth/devstorage.read_write
https://www.googleapis.com/auth/devstorage.read_only
...

注:「docker pull」には「read_only」が必要ですが、「docker Push」が必要です「read_write」が必要です。

このロボットが別のプロジェクトのバケットにアクセスできるようにするには、いくつかの手順があります。

まず、VMサービスアカウント(ロボット)のIDを次の方法で見つけます。

$ curl -H 'Metadata-Flavor: Google' $SVC_ACCT/email
[email protected]

次に、更新する3つの重要なACLがあります。

1)バケットACL(リストオブジェクトなどに必要)

PROJECT_ID=correct-answer-42
[email protected]
gsutil acl ch -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com

2)バケットのデフォルトACL(将来の#3のテンプレート)

gsutil defacl ch -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com

3)オブジェクトACL(バケットが空でない場合にのみ必要)

gsutil -m acl ch -R -u $ROBOT:R gs://artifacts.$PROJECT_ID.appspot.com

これがまだ公式ドキュメントに含まれていない理由の1つは、より優れた高レベルのストーリーが必要なことですが、tl; drはGCS ACLを尊重しています。

47
mattmoor

ここでの答えは、Google Compute Engineインスタンス内からdockerにアクセスすることです。

Vanilla dockerを使用して、Google Compute Engineにないマシン(つまりローカル)でGoogle Container Registryを操作する場合は、 Googleの指示に従って を実行できます。

2つの主な方法は、アクセストークンまたはJSONキーファイルを使用することです。

_tokenおよび_json_keyは、ユーザー名に指定する実際の値です(-u

アクセストークン

$ docker login -e [email protected] -u _token -p "$(gcloud auth print-access-token)" https://gcr.io

JSONキーファイル

$ docker login -e [email protected] -u _json_key -p "$(cat keyfile.json)" https://gcr.io

キーファイルを作成するには、次の手順に従います。

  1. 資格情報ページを開きます。
  2. 新しいサービスアカウントを設定するには、次の手順を実行します。
    • [資格情報の追加]> [サービスアカウント]をクリックします。
    • サービスアカウントの公開/秘密キーを標準のP12ファイルとしてダウンロードするか、Google APIクライアントライブラリでロードできるJSONファイルとしてダウンロードするかを選択します。
    • 新しい公開/秘密キーペアが生成され、マシンにダウンロードされます。このキーの唯一のコピーとして機能します。あなたはそれを安全に保管する責任があります。

キーファイルの生成に関するGoogleのドキュメントを参照

18
anthonator

2つの公式な方法 があります。

  1. $ docker login -e [email protected] -u oauth2accesstoken -p "$(gcloud auth print-access-token)" https://gcr.io
  2. _$ docker login -e [email protected] -u _json_key -p "$JSON_KEY" https://gcr.io_

注:電子メールは使用されないため、必要なものを何でも入力できます。

_gcr.io_を Google Container Registry に表示されるドメインに変更します(例:_eu.gcr.io_)。

オプション(1)は一時トークンのみを提供するため、おそらくオプション(2)が必要です。それを取得するには_$JSON_KEY_:

  1. API Manager> Credentials に移動します
  2. [資格情報の作成]>サービスアカウントキー:をクリックします。
    • サービスアカウント:新しいサービスアカウント
      • 名前:Docker Registry (read-only)など、必要なもの
      • 役割:ストレージ(スクロールダウン)>ストレージオブジェクトビューアー
    • キータイプ:[〜#〜] json [〜#〜]
  3. _keyfile.json_としてダウンロード
  4. JSON_KEY=$(cat keyfile.json | tr '\n' ' ')
  5. これで使用できます。

ログインしたら、_docker pull_を実行するだけです。更新された_~/.dockercfg_をコピーして、設定を保持することもできます。

5
Wernight

VMを作成したときに、レジストリから読み取れるようにするために必要なスコープを与えましたか?

gcloud compute instance create INSTANCE\--scopes https://www.googleapis.com/auth/devstorage.read_write

その場合、それ以上の認証は必要ありません。

1
Jesse

公式の Google Container Registry Authプラグイン が公開されています。あなたはそれを試して、フィードバック/報告の問題を残して大歓迎です。

0
Wei