【问题标题】:How to add local GOOGLE_APPLICATION_CREDENTIALS to docker on docker run command?如何在 docker run 命令上将本地 GOOGLE_APPLICATION_CREDENTIALS 添加到 docker?
【发布时间】:2019-12-10 01:51:29
【问题描述】:

我正在尝试使用使用某些 GCP 服务的应用程序运行 docker 容器。

我已经创建并下载了一个服务帐号json密钥,运行时可以在docker外运行应用程序

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/project-credentials-123.json"

在运行应用程序之前。

但是,当我在 docker 中运行应用程序时,GCP 客户端库找不到默认访问密钥。

我正在使用的 docker run 命令如下所示:

docker run -p 8501:8501 -e GOOGLE_APPLICATION_CREDENTIALS=/tmp/keys/project-credentials-123.json -v $GOOGLE_APPLICATION_CREDENTIALS:/tmp/keys/project-credentials-123.json:ro 571a38aaaf15 streamlit run src/app/app.py

571a38aaaf15 是 docker 镜像 ID。

请注意,我将project-credentials-123.json 复制到/tmp/keys/ 以便更好地关注https://cloud.google.com/run/docs/testing/local


注意:类似于Set GOOGLE_APPLICATION_CREDENTIALS in Docker,但由于

【问题讨论】:

  • 如果你启动你的容器然后在里面运行一个shall,你能在容器内的shell提示符下手动运行你的命令吗?
  • 实际错误的症状/信息是什么?
  • 我正在运行一个 python 网络应用程序,所以唯一的信息是无法检测到 GOOGLE_APPLICATION_CREDENTIALS。主要是我想和同事共享一个运行命令,所以我不希望他们交互式地进入容器来设置里面的路径。
  • 您好...为了调试,您能否设置容器的运行实例,然后进入容器内部的外壳以进行测试。然后,手动运行失败的命令,反馈报错的详细描述?
  • 谢谢@Kolban,这激发了我在下面分享的答案(它似乎有效)。有什么问题吗?

标签: docker google-cloud-platform


【解决方案1】:

我想我明白了。

正确的格式是:

docker run -v /tmp/keys/:/tmp/keys -p 8501:8501 571a38aaaf15 export GOOGLE_APPLICATION_CREDENTIALS="/tmp/keys/project-credentials-123.json" | streamlit run src/app/app.py

我对正在发生的事情的理解是

  1. 我的笔记本电脑上有一个文件/tmp/keys/project-credentials-123.json, 并且 -v 标志表示“将我的机器的 /tmp/keys/ 目录安装在容器中容器的 /tmp/keys/ 目录上”。
  2. 我在容器中运行的第一个命令是将此文件导出为我的凭据。

附:请让我知道实现此目的的更好方法。

【讨论】:

  • 您的容器将在哪里运行?在 GCP 还是其他地方?
  • 计划将其部署在 GCP 中(其中大部分将无关紧要),但我的大部分团队都在本地开发,所以我必须解决这个问题才能让他们购买使用 docker .
  • 我已按照您的指南进行操作,但出现类似“java.lang.NullPointerException”这样的错误,请问您可以给我吗?
【解决方案2】:

如果您的容器托管在 GCP 上,则无需像这样挂载卷并设置密钥,因为您可以使用底层平台的身份。

当我必须在本地使用容器并且我必须在其中注入密钥文件时,我直接注入密钥文件的内容,而不安装卷。像这样,我让我的容器保持无状态并符合 Cloud Run 和 Knative。

FROM....
....
ENV GOOGLE_APPLICATION_CREDENTIALS /tmp/key.json

# Run the web service on container startup.
CMD if [ -z $KEY ] ; then export  GOOGLE_APPLICATION_CREDENTIALS=; else echo $KEY > /tmp/key.json;fi  && ....your usual command...

您将GOOGLE_APPLICATION_CREDENTIALS 设置为NULL,否则Google 库将在查看底层平台标识之前查看是否存在。

然后,我像这样运行我的命令

Docker run -e KEY="$(cat key.json)" <TAG>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2022-01-09
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    相关资源
    最近更新 更多