用户 Google 临时容器内的云凭据?
User Google Cloud credentials inside ephemeral container?
我们的大部分工作都使用 Docker 容器,包括在我们自己的机器上进行开发。这些是短暂的(例如,每次我们 运行 测试时启动)。
对于 AWS,身份验证很简单 - 我们的环境中有我们的密钥,这些密钥会传递给容器。
我们开始使用Google 云服务,授权路径似乎比AWS 更难。在做本地开发时,gcloud auth login
效果很好。但是当在临时容器中工作时,每次都需要登录过程,而且我还没有找到一种使用 a) 环境变量或 b) 映射卷来持久保存用户凭据的方法——这是将数据传递到的两种方法容器。
据我所知,唯一的途径是使用服务帐户。但我认为每个人都需要自己的服务帐户,并且需要不断更新该帐户的权限以与自己的权限保持一致。
有没有更好的方法?
让本地容器看到 gcloud 凭据的最简单方法可能是将 application default credentials 的文件系统位置映射到容器中。
首先,做
gcloud auth application-default login
然后,运行您的容器作为
docker run -ti -v=$HOME/.config/gcloud:/root/.config/gcloud test
这应该有效。我用
这样的 Dockerfile 试了一下
FROM node:4
RUN npm install --save @google-cloud/storage
ADD test.js .
CMD node ./test.js
和 test.js
文件如
var storage = require('@google-cloud/storage');
var gcs = storage({
projectId: 'my-project-515',
});
var bucket = gcs.bucket('my-bucket');
bucket.getFiles(function(err, files) {
if (err) {
console.log("failed to get files: ", err)
} else {
for (var i in files) {
console.log("file: ", files[i].name)
}
}
})
它按预期工作。
我遇到了同样的问题,但我使用的是 docker-compose。通过将以下内容添加到 docker-compose.yml
:
解决了这个问题
volumes:
- $HOME/.config/gcloud:/root/.config/gcloud
我们的大部分工作都使用 Docker 容器,包括在我们自己的机器上进行开发。这些是短暂的(例如,每次我们 运行 测试时启动)。
对于 AWS,身份验证很简单 - 我们的环境中有我们的密钥,这些密钥会传递给容器。
我们开始使用Google 云服务,授权路径似乎比AWS 更难。在做本地开发时,gcloud auth login
效果很好。但是当在临时容器中工作时,每次都需要登录过程,而且我还没有找到一种使用 a) 环境变量或 b) 映射卷来持久保存用户凭据的方法——这是将数据传递到的两种方法容器。
据我所知,唯一的途径是使用服务帐户。但我认为每个人都需要自己的服务帐户,并且需要不断更新该帐户的权限以与自己的权限保持一致。
有没有更好的方法?
让本地容器看到 gcloud 凭据的最简单方法可能是将 application default credentials 的文件系统位置映射到容器中。
首先,做
gcloud auth application-default login
然后,运行您的容器作为
docker run -ti -v=$HOME/.config/gcloud:/root/.config/gcloud test
这应该有效。我用
这样的 Dockerfile 试了一下FROM node:4
RUN npm install --save @google-cloud/storage
ADD test.js .
CMD node ./test.js
和 test.js
文件如
var storage = require('@google-cloud/storage');
var gcs = storage({
projectId: 'my-project-515',
});
var bucket = gcs.bucket('my-bucket');
bucket.getFiles(function(err, files) {
if (err) {
console.log("failed to get files: ", err)
} else {
for (var i in files) {
console.log("file: ", files[i].name)
}
}
})
它按预期工作。
我遇到了同样的问题,但我使用的是 docker-compose。通过将以下内容添加到 docker-compose.yml
:
volumes:
- $HOME/.config/gcloud:/root/.config/gcloud