2017-08-08 9 views
0

私はすべてのネットワークの詳細を含むdocker inspect ...からJSONスニペットを出力するようにしています。問題は、ネットワークの名前が異なることです。JQで親辞書のキーにアクセスする方法

役立つ場合はスニペットを共有している場合は、JQ Snippet

各ネットワークの名前を明示的に指定しているため、最初の試行が有効です(ingressおよびwebnet)。私は最終的な解決策は、フィルタのネットワーク名は言及しないが、出力にそれらを持っています。

jq '.[] | { Networks: (.NetworkSettings .Networks | {ingress: .ingress .IPAddress, webnet: .webnet .IPAddress})}' 

ここに出力があります。

{ 
    "Networks": { 
    "ingress": "10.255.0.5", 
    "webnet": "10.0.0.3" 
    } 
} 

私はいくつかの調査を行い、私が望むノードに変数を割り当てることができますが、親キーは割り当てできないことがわかりました。

jq '.[] | .NetworkSettings .Networks[] as $parent | { IPAddress: $parent .IPAddress, NetworkID: $parent .NetworkID }' 

ここにはノードの詳細はありますが、親キーはありません。

{ 
    "IPAddress": "10.255.0.5", 
    "NetworkID": "zznyce2va5pfggq14su51zygn" 
} 
{ 
    "IPAddress": "10.0.0.3", 
    "NetworkID": "g66ea3npnaiwvvdy66rijt5yo" 
} 

次は、キーにはアクセスできましたが、詳細は表示されませんでした。

jq '.[] | .NetworkSettings .Networks | keys[] as $key | $key' 

ここに出力があります。

"ingress" 
"webnet" 

子の詳細を出力する際に​​、親キー名にラベルとしてアクセスするにはどうすればよいですか?私は次のようなものが必要だと思うが、それが正しいか、どうやってそこに行くのか分からない。

($key): { IPAddress: $parent[$key] .IPAddress, NetworkID: $parent[$key] .NetworkID } 

私の最終的な解決策は、詳細をいくつかのレベルですべてのネットワークの詳細と組み合わせることです。私は上記の問題を解決することができれば、私は以下の問題を解決することができると思うが、それが役に立つ場合にはそれを含める。

.[] | {Name: .Name, Id: .Id, Path: .Path, Networks: (.NetworkSettings .Networks | {ingress: { IPAddress: .ingress .IPAddress, NetworkID: .ingress .NetworkID }, 
webnet: {IPAddress: .webnet .IPAddress, NetworkID: .webnet .NetworkID}})} 

ここに出力があります。

{ 
    "Name": "/nginx.1.attiwcma8h39wclpsncp608tk", 
    "Id": "f2ee9caae862326a7a62304659121c506f8afb9d74080475702da3595576937a", 
    "Path": "nginx", 
    "Networks": { 
    "ingress": { 
     "IPAddress": "10.255.0.5", 
     "NetworkID": "zznyce2va5pfggq14su51zygn" 
    }, 
    "webnet": { 
     "IPAddress": "10.0.0.3", 
     "NetworkID": "g66ea3npnaiwvvdy66rijt5yo" 
    } 
    } 
} 

ありがとう、ウェス。

スニペットにアクセスできない場合の入力です。ここで

[ 
    { 
     "Id": "f2ee9caae862326a7a62304659121c506f8afb9d74080475702da3595576937a", 
     "Created": "2017-08-08T14:17:47.911028584Z", 
     "Path": "nginx", 
     "Args": [ 
      "-g", 
      "daemon off;" 
     ], 
     "State": { 
      "Status": "running", 
      "Running": true, 
      "Paused": false, 
      "Restarting": false, 
      "OOMKilled": false, 
      "Dead": false, 
      "Pid": 18628, 
      "ExitCode": 0, 
      "Error": "", 
      "StartedAt": "2017-08-08T14:17:48.299360684Z", 
      "FinishedAt": "0001-01-01T00:00:00Z" 
     }, 
     "Image": "sha256:b8efb18f159bd948486f18bd8940b56fd2298b438229f5bd2bcf4cedcf037448", 
     "ResolvConfPath": "/var/lib/docker/containers/f2ee9caae862326a7a62304659121c506f8afb9d74080475702da3595576937a/resolv.conf", 
     "HostnamePath": "/var/lib/docker/containers/f2ee9caae862326a7a62304659121c506f8afb9d74080475702da3595576937a/hostname", 
     "HostsPath": "/var/lib/docker/containers/f2ee9caae862326a7a62304659121c506f8afb9d74080475702da3595576937a/hosts", 
     "LogPath": "/var/lib/docker/containers/f2ee9caae862326a7a62304659121c506f8afb9d74080475702da3595576937a/f2ee9caae862326a7a62304659121c506f8afb9d74080475702da3595576937a-json.log", 
     "Name": "/nginx.1.attiwcma8h39wclpsncp608tk", 
     "RestartCount": 0, 
     "Driver": "overlay", 
     "MountLabel": "", 
     "ProcessLabel": "", 
     "AppArmorProfile": "", 
     "ExecIDs": null, 
     "HostConfig": { 
      "Binds": null, 
      "ContainerIDFile": "", 
      "LogConfig": { 
       "Type": "json-file", 
       "Config": {} 
      }, 
      "NetworkMode": "default", 
      "PortBindings": {}, 
      "RestartPolicy": { 
       "Name": "", 
       "MaximumRetryCount": 0 
      }, 
      "AutoRemove": false, 
      "VolumeDriver": "", 
      "VolumesFrom": null, 
      "CapAdd": null, 
      "CapDrop": null, 
      "Dns": null, 
      "DnsOptions": null, 
      "DnsSearch": null, 
      "ExtraHosts": null, 
      "GroupAdd": null, 
      "IpcMode": "", 
      "Cgroup": "", 
      "Links": null, 
      "OomScoreAdj": 0, 
      "PidMode": "", 
      "Privileged": false, 
      "PublishAllPorts": false, 
      "ReadonlyRootfs": false, 
      "SecurityOpt": null, 
      "UTSMode": "", 
      "UsernsMode": "", 
      "ShmSize": 67108864, 
      "Runtime": "runc", 
      "ConsoleSize": [ 
       0, 
       0 
      ], 
      "Isolation": "", 
      "CpuShares": 0, 
      "Memory": 0, 
      "NanoCpus": 0, 
      "CgroupParent": "", 
      "BlkioWeight": 0, 
      "BlkioWeightDevice": null, 
      "BlkioDeviceReadBps": null, 
      "BlkioDeviceWriteBps": null, 
      "BlkioDeviceReadIOps": null, 
      "BlkioDeviceWriteIOps": null, 
      "CpuPeriod": 0, 
      "CpuQuota": 0, 
      "CpuRealtimePeriod": 0, 
      "CpuRealtimeRuntime": 0, 
      "CpusetCpus": "", 
      "CpusetMems": "", 
      "Devices": null, 
      "DeviceCgroupRules": null, 
      "DiskQuota": 0, 
      "KernelMemory": 0, 
      "MemoryReservation": 0, 
      "MemorySwap": 0, 
      "MemorySwappiness": -1, 
      "OomKillDisable": false, 
      "PidsLimit": 0, 
      "Ulimits": null, 
      "CpuCount": 0, 
      "CpuPercent": 0, 
      "IOMaximumIOps": 0, 
      "IOMaximumBandwidth": 0 
     }, 
     "GraphDriver": { 
      "Data": { 
       "LowerDir": "/var/lib/docker/overlay/f7e30463365de46a74cbdf5835ad6d5ab6f390a4d53fb42c25b6a43a59cf6910/root", 
       "MergedDir": "/var/lib/docker/overlay/6a3ac9fc31cda9ace1b7b02935cb2467be7a97984fe33f01a73706a8eae07968/merged", 
       "UpperDir": "/var/lib/docker/overlay/6a3ac9fc31cda9ace1b7b02935cb2467be7a97984fe33f01a73706a8eae07968/upper", 
       "WorkDir": "/var/lib/docker/overlay/6a3ac9fc31cda9ace1b7b02935cb2467be7a97984fe33f01a73706a8eae07968/work" 
      }, 
      "Name": "overlay" 
     }, 
     "Mounts": [], 
     "Config": { 
      "Hostname": "f2ee9caae862", 
      "Domainname": "", 
      "User": "", 
      "AttachStdin": false, 
      "AttachStdout": false, 
      "AttachStderr": false, 
      "ExposedPorts": { 
       "80/tcp": {} 
      }, 
      "Tty": false, 
      "OpenStdin": false, 
      "StdinOnce": false, 
      "Env": [ 
       "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
       "NGINX_VERSION=1.13.3-1~stretch", 
       "NJS_VERSION=1.13.3.0.1.11-1~stretch" 
      ], 
      "Cmd": [ 
       "nginx", 
       "-g", 
       "daemon off;" 
      ], 
      "ArgsEscaped": true, 
      "Image": "nginx:[email protected]:788fa27763db6d69ad3444e8ba72f947df9e7e163bad7c1f5614f8fd27a311c3", 
      "Volumes": null, 
      "WorkingDir": "", 
      "Entrypoint": null, 
      "OnBuild": null, 
      "Labels": { 
       "com.docker.swarm.node.id": "3hq6jrjhs4ndk5lffpg52xj13", 
       "com.docker.swarm.service.id": "w787z4alcw4t3p0nesgwhj1yn", 
       "com.docker.swarm.service.name": "nginx", 
       "com.docker.swarm.task": "", 
       "com.docker.swarm.task.id": "attiwcma8h39wclpsncp608tk", 
       "com.docker.swarm.task.name": "nginx.1.attiwcma8h39wclpsncp608tk" 
      }, 
      "StopSignal": "SIGTERM" 
     }, 
     "NetworkSettings": { 
      "Bridge": "", 
      "SandboxID": "66e098ef6e1bea3b2f66dcc7460eab9fc23436cb39836918a46e1d38692a55cb", 
      "HairpinMode": false, 
      "LinkLocalIPv6Address": "", 
      "LinkLocalIPv6PrefixLen": 0, 
      "Ports": { 
       "80/tcp": null 
      }, 
      "SandboxKey": "/var/run/docker/netns/66e098ef6e1b", 
      "SecondaryIPAddresses": null, 
      "SecondaryIPv6Addresses": null, 
      "EndpointID": "", 
      "Gateway": "", 
      "GlobalIPv6Address": "", 
      "GlobalIPv6PrefixLen": 0, 
      "IPAddress": "", 
      "IPPrefixLen": 0, 
      "IPv6Gateway": "", 
      "MacAddress": "", 
      "Networks": { 
       "ingress": { 
        "IPAMConfig": { 
         "IPv4Address": "10.255.0.5" 
        }, 
        "Links": null, 
        "Aliases": [ 
         "f2ee9caae862" 
        ], 
        "NetworkID": "zznyce2va5pfggq14su51zygn", 
        "EndpointID": "09b287a8d82e85d0790a8ea8634e97844481cb478ded89f6ac1dfda7e3c31f76", 
        "Gateway": "", 
        "IPAddress": "10.255.0.5", 
        "IPPrefixLen": 16, 
        "IPv6Gateway": "", 
        "GlobalIPv6Address": "", 
        "GlobalIPv6PrefixLen": 0, 
        "MacAddress": "02:42:0a:ff:00:05", 
        "DriverOpts": null 
       }, 
       "webnet": { 
        "IPAMConfig": { 
         "IPv4Address": "10.0.0.3" 
        }, 
        "Links": null, 
        "Aliases": [ 
         "f2ee9caae862" 
        ], 
        "NetworkID": "g66ea3npnaiwvvdy66rijt5yo", 
        "EndpointID": "46b7ef9ba2d82cf56f34ade3a80a094b5f92f05d5e9051dab0542e2992298bb2", 
        "Gateway": "", 
        "IPAddress": "10.0.0.3", 
        "IPPrefixLen": 24, 
        "IPv6Gateway": "", 
        "GlobalIPv6Address": "", 
        "GlobalIPv6PrefixLen": 0, 
        "MacAddress": "02:42:0a:00:00:03", 
        "DriverOpts": null 
       } 
      } 
     } 
    } 
] 

答えて

1

多少はここ

.[] 
    | { 
     Name: .Name, 
     Id: .Id, 
     Path: .Path, 
     Networks: (
      .NetworkSettings.Networks 
      | { 
      ingress: { IPAddress: .ingress.IPAddress, NetworkID:.ingress.NetworkID }, 
      webnet: { IPAddress: .webnet.IPAddress, NetworkID:.webnet.NetworkID } 
      } 
     ) 
    } 

を再フォーマットすると、固定ネットワークキーを使用して、元の溶液は、を使用して、より一般的なソリューションですネットワークを構築するためにキーを減らす

オブジェクト
.[] 
    | { 
     Name: .Name, 
     Id: .Id, 
     Path: .Path, 
     Networks: (
      .NetworkSettings.Networks as $n 
      | reduce ($n|keys[]) as $k (
       {} 
      ; .[$k] = ($n[$k] | {IPAddress, NetworkID}) 
      ) 
     ) 
    } 

を少し使いやすくすることができます新しいオブジェクトを作成する代わりにネットワークを更新する方法

.[] 
    | { 
     Name: .Name, 
     Id: .Id, 
     Path: .Path, 
     Networks: (
      .NetworkSettings.Networks 
      | reduce keys[] as $k (
       . 
      ; .[$k] |= {IPAddress, NetworkID} 
      ) 
     ) 
    } 
+0

ありがとう。それは私が探している結果を私に与えますが、それを消化するのに私はしばらく時間がかかります。 – Wes

関連する問題