33

コンテナーの実行を開始したい CoreOS Docker ホストがありますが、docker コマンドを使用して Google コンテナーのプライベート レジストリ ( https://cloud.google.com/tools/container-registry/ )、403 が表示されます。検索を行いましたが、認証をアタッチする方法 (または docker login コマンドで使用する user+pass バンドルを生成する場所) がわかりません。

Google のプライベート コンテナから引っ張って運が良かった人はいますか? 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 not@val.id -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
4

6 に答える 6

54

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

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

Google Compute Engineでは、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 not@val.id -u '_token' -p $ACCESS_TOKEN https://gcr.io

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

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

_token を囲む引用符の更新

docker バージョン 1.8 の時点で、docker login には -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
1234567890@developer.gserviceaccount.com

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

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

PROJECT_ID=correct-answer-42
ROBOT=1234567890@developer.gserviceaccount.com
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 つは、より高度な概要が必要だからです。ただし、GCS ACL を尊重します。

于 2015-03-27T22:36:17.953 に答える
18

ここでの回答は、Google Compute Engine インスタンス内から docker にアクセスする方法を扱います。

Google Compute Engine 以外のマシン (つまり、ローカル) でバニラ docker を使用して Google Container Registry を操作する場合は、Google の指示に従ってください

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

_token_json_keyは、ユーザー名に指定した実際の値であることに注意してください( -u)

アクセストークン

$ docker login -e 1234@5678.com -u _token -p "$(gcloud auth print-access-token)" https://gcr.io

JSON キー ファイル

$ docker login -e 1234@5678.com -u _json_key -p "$(cat keyfile.json)" https://gcr.io

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

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

キー ファイルの生成に関する Google のドキュメントは、こちら でご覧いただけます。

于 2015-11-18T04:21:28.987 に答える
1

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

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

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

于 2015-03-29T15:44:37.933 に答える
-1

@mattmoorのソリューションを使用して、GCEで実行されているスレーブがGoogleのレジストリにログインできるようにするjenkinsプラグインを開発しました。他の人に役立つかもしれません。:)

https://github.com/Byclosure/gcr.io-login-pluginで入手できます。

于 2015-05-12T15:44:08.930 に答える