如何使用 docker inspect --format 从对象获取第一个密钥(获取容器网络的名称)

sto*_*opa 3 docker

我有这样的命令:

$ docker inspect reacthublh_mysql_1 -f "{{json .NetworkSettings.Networks }}"
Run Code Online (Sandbox Code Playgroud)

为我提取的输出:

{"reacthublh-network":{"IPAMConfig":null,"Links":null,"Aliases":["1b905711e127","mysql"],"NetworkID":"d2b6bd4815a2eb48a57d05e5d219894f453c15e3f8b5a331a5f0668ed98f4730","EndpointID":"c71240571cc1cfb7bd50119aaf6aaef3dfbc2dc56732e0fd6f593ebe00861edc","Gateway":"172.30.0.1","IPAddress":"172.30.0.2","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:1e:00:02","DriverOpts":null}}
Run Code Online (Sandbox Code Playgroud)

问题是如何仅提取作为 json 对象的第一个键的reacthublh-network

更新:

我现在找到的唯一方法是:

$ docker inspect reacthublh_mysql_1 -f "{{json .NetworkSettings.Networks }}" | cut -d '"' -f2
Run Code Online (Sandbox Code Playgroud)

它输出的正是我需要的,但我很好奇是否仍然可以在 --format 参数中执行它

Dav*_*aze 5

docker inspect -f选项使用 Go文本/模板语言,扩展很少。我认为不能直接只打印第一个网络名称,但可以打印出所有网络名称而没有其他详细信息。这里的技巧是将该Networks对象作为映射迭代并打印出键:

docker inspect jolly_hodgkin \
  -f '{{range $k, $v := .NetworkSettings.Networks}}{{printf "%s\n" $k}}{{end}}'
Run Code Online (Sandbox Code Playgroud)

如果您有一个专门构建的用于 JSON 操作的命令行工具(如jq),它的查询语言可能更强大,更适合您需要的数据操作。一个jq专门获取第一个 Docker 网络名称的调用可能看起来像

docker inspect jolly_hodgkin \
  | jq -r '.[].NetworkSettings.Networks | keys | first'
Run Code Online (Sandbox Code Playgroud)