Docker 守护进程(不是容器)无法读取环境变量

rod*_*ira 3 docker google-cloud-platform

尝试配置在 GCP 之外运行的容器以登录到 Google Cloud Platform (StackDriver)。一项要求是 Docker 守护程序能够定位环境变量,GOOGLE_APPLICATION_CREDENTIALS以便进行身份验证。人们会假设以下内容会起作用,但它不会:

GOOGLE_APPLICATION_CREDENTIALS=/usr/local/keys/project-1.json docker run --log-driver=gcplogs ...
Run Code Online (Sandbox Code Playgroud)

输出:

ERROR: for api Cannot start service api:
       failed to initialize logging driver: google: could not find default credentials.
       See https://developers.google.com/accounts/docs/application-default-credentials
       for more information.
Run Code Online (Sandbox Code Playgroud)

还没有找到任何关于如何直接在 上设置它的文档daemon.json,但我也不希望那样做,因为我可能有不同的容器记录到不同的 GCP 项目。

我已经在 Mac(docker 桌面)和 Debian 上试过了。

Kun*_*Deo 6

这是一个不断出现的问题。这里发生的是环境变量GOOGLE_APPLICATION_CREDENTIALS由系统 docker 守护进程加载。系统守护进程看不到用户登录中设置的环境变量。您需要做的是在系统级别设置GOOGLE_APPLICATION_CREDENTIALS

以下是如何在 Ubuntu(Systemd) 中执行此操作:

$ sudo mkdir -p /etc/systemd/system/docker.service.d
Run Code Online (Sandbox Code Playgroud)

使用以下内容创建/etc/systemd/system/docker.service.d/env.conf

[Service]
Environment="GOOGLE_APPLICATION_CREDENTIALS=/path/to/file.json"  
Run Code Online (Sandbox Code Playgroud)

应用更改。

$ sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

完成后重启 docker/containerd 守护进程

$ sudo systemctl restart containerd
$ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

测试 gcplogs 驱动程序

docker run --log-driver=gcplogs --log-opt gcp-project="my-project" hello-world
Run Code Online (Sandbox Code Playgroud)