如何使用python / listing docker images

时间:2017-09-27 14:14:10

标签: python google-compute-engine google-container-registry

使用gcloud auth print-access-token获取的访问令牌显然是一个不同于我可以通过一些基本python代码获得的访问令牌:

export GOOGLE_APPLICATION_CREDENTIALS=/the-credentials.json
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
credentials.get_access_token()

我要做的是获得一个可以使用的令牌:

curl -u _token:<mytoken> https://eu.gcr.io/v2/my-project/my-docker-image/tags/list

我不想安装gcloud实用程序作为我的应用程序的依赖项,因此我尝试通过誓言google凭据以编程方式获取访问令牌

2 个答案:

答案 0 :(得分:2)

所以我认为有几个问题:

gcloud auth print-access-token vs GoogleCredentials.get_application_default()

执行gcloud时,

gcloud auth login不再默认设置应用程序默认凭据,因此您从gcloud auth print-access-token获取的access_token将是与使用的对应的access_token你曾经登录过。

只要您按照instructions为服务帐户创建ADC,该帐户就有the necessary permissions,并且您执行该脚本的环境可以访问ENV var和adc .json文件,你应该没事。

如何让curl工作

Docker Registry API指定发生令牌交换,将您的Basic身份验证(即Authorization: Basic base64(_token:<gcloud_access_token>))交换为短期承载令牌。这个过程可能有点涉及,但记录在案here under "How to authenticate" and "Requesting a Token"。将auth.docker.io/token替换为eu.gcr.io/v2/token,将service=registry.docker.io替换为service=eu.gcr.io等。在此使用curl -u oauth2accesstoken:<mytoken>

另请参阅:How to list images and tags from the gcr.io Docker Registry using the HTTP API?

完全避免这个问题

我们有一个可能与您的需求相关的python库: https://github.com/google/containerregistry

答案 1 :(得分:1)

我知道这是一个非常老的问题,但是我刚遇到the exact same problem of requiring an ACCESS_TOKEN in Python and not being able to generate it,并设法使其正常工作。

您需要执行的操作是使用变量credentials.token,除了在您第一次创建凭证对象并返回None后将不存在该变量。为了生成令牌,凭据必须由google.cloud库使用,在我的情况下,这是通过使用googleapiclient.discovery.build方法完成的:

sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta4', credentials=credentials)
response = sqladmin.instances().get(project=PROJECT_ID, instance=INSTANCE_ID).execute()
print(json.dumps(response))

之后,可以使用

正确生成ACCESS_TOKEN
access_token = credentials.token

我还使用google.cloud storage作为测试凭据的一种方式对其进行了测试,它也可以通过尝试通过适当的Python库访问GCS中的存储桶来实现:

from google.oauth2 import service_account
from google.cloud import storage
PROJECT_ID = your_project_id_here
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = '/path/to/service.json'
credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)
try:
    list(storage.Client(project=PROJECT_ID, credentials=credentials).bucket('random_bucket').list_blobs())
except:
    print("Failed because no bucket exists named 'random_bucket' in your project... but that doesn't matter, what matters is that the library tried to use the credentials and in doing so generated an access_token, which is what we're interested in right now")

access_token = credentials.token
print(access_token)