系统范围的 Docker 登录?

系统范围的 Docker 登录?

有没有办法将整个机器/Docker 守护进程记录到注册表中?

我所看到的有关 docker login 和各种专有凭证助手用途的所有内容~/.docker/config.json都是针对每个用户的。

我遇到一种情况,我想从私有注册表中提取图像;多个人在这些机器上都有任意的 sudo 访问权限,并且应该能够对我们的注册表使用 Docker。

因为无论如何 Docker 访问都应该被视为对机器的 root 访问(即,如果用户能够运行 Docker,则用户凭据就不是相互安全的),并且 sudo 访问是相同的但更直接,所以我想直接切入正题并登录整个机器,而无需每个用户都经历各种麻烦。

我可以提供一个文件,让每个人都可以链接到他们的文件config.json,但我更希望从每台机器第一次登录时就开始处理它。

答案1

我想到三种选择:

  1. 不要将镜像设为私有,而应允许任何人拉取可以访问注册表服务器的镜像。这在环境中相当常见,因为镜像应该只包含运行应用程序所需的库和二进制文件,而不包含运行时注入或存储在卷中的配置文件、机密或数据。

  2. 如果每个人都有 sudo 访问权限,请从 sudo 运行 docker 命令,包括登录。凭据将存储在 root 用户的~/.docker/config.json

  3. 制作您自己的凭证助手,仅将登录信息输出到主机。凭证助手接口非常简单,4 个操作(存储、获取、列出、清除)可以在 shell 脚本上实现。对于登录,您可能只需要获取操作。

该凭证帮助程序脚本看起来像一个名为docker-credential-your-helper(其中your-helper可以是您选择的名称)的脚本:

#!/bin/sh

your_registry='
{ "ServerURL": "your-registry",
  "Username": "your-user",
  "Secret": "your-pass"
}
'

if [ "$1" = "get" ]; then
  read hostname
  case "$hostname" in
    your-registry)
      echo "${your_registry}"
      exit 0
      ;;
  esac
elif [ "$1" = "list" ]; then
  echo "your-registry"
fi
# everything else is unhandled
exit 1

使该文件可执行并将其放置在路径中。然后每个用户~/.docker/config.json都会有一个凭据帮助程序条目(请注意,docker-credential-此文件中不包含该条目,只有文件名后面的部分):

{
  "credHelpers": {
    "your-host": "your-helper"
  }
}

相关内容