@@ -18,8 +18,6 @@ type generator struct {
1818 TLSVerify bool
1919 TLSCert , TLSCaCert , TLSKey string
2020
21- dockerInfo Server
22-
2321 wg sync.WaitGroup
2422}
2523
@@ -45,6 +43,14 @@ func NewGenerator(gc GeneratorConfig) (*generator, error) {
4543 return nil , fmt .Errorf ("Unable to create docker client: %s" , err )
4644 }
4745
46+ apiVersion , err := client .Version ()
47+ if err != nil {
48+ log .Printf ("error retrieving docker server version info: %s\n " , err )
49+ }
50+
51+ // Grab the docker daemon info once and hold onto it
52+ SetDockerEnv (apiVersion )
53+
4854 return & generator {
4955 Client : client ,
5056 Endpoint : gc .Endpoint ,
@@ -66,7 +72,7 @@ func (g *generator) Generate() error {
6672}
6773
6874func (g * generator ) generateFromContainers (client * docker.Client ) {
69- containers , err := GetContainers (client )
75+ containers , err := g . getContainers (client )
7076 if err != nil {
7177 log .Printf ("error listing containers: %s\n " , err )
7278 return
@@ -99,7 +105,7 @@ func (g *generator) generateAtInterval(client *docker.Client, configs ConfigFile
99105 for {
100106 select {
101107 case <- ticker .C :
102- containers , err := GetContainers (client )
108+ containers , err := g . getContainers (client )
103109 if err != nil {
104110 log .Printf ("Error listing containers: %s\n " , err )
105111 continue
@@ -238,3 +244,103 @@ func (g *generator) sendSignalToContainer(client *docker.Client, config Config)
238244 }
239245 }
240246}
247+
248+ func (g * generator ) getContainers (client * docker.Client ) ([]* RuntimeContainer , error ) {
249+ apiInfo , err := client .Info ()
250+ if err != nil {
251+ log .Printf ("error retrieving docker server info: %s\n " , err )
252+ }
253+
254+ SetServerInfo (apiInfo )
255+
256+ apiContainers , err := client .ListContainers (docker.ListContainersOptions {
257+ All : false ,
258+ Size : false ,
259+ })
260+ if err != nil {
261+ return nil , err
262+ }
263+
264+ containers := []* RuntimeContainer {}
265+ for _ , apiContainer := range apiContainers {
266+ container , err := client .InspectContainer (apiContainer .ID )
267+ if err != nil {
268+ log .Printf ("error inspecting container: %s: %s\n " , apiContainer .ID , err )
269+ continue
270+ }
271+
272+ registry , repository , tag := splitDockerImage (container .Config .Image )
273+ runtimeContainer := & RuntimeContainer {
274+ ID : container .ID ,
275+ Image : DockerImage {
276+ Registry : registry ,
277+ Repository : repository ,
278+ Tag : tag ,
279+ },
280+ Name : strings .TrimLeft (container .Name , "/" ),
281+ Hostname : container .Config .Hostname ,
282+ Gateway : container .NetworkSettings .Gateway ,
283+ Addresses : []Address {},
284+ Networks : []Network {},
285+ Env : make (map [string ]string ),
286+ Volumes : make (map [string ]Volume ),
287+ Node : SwarmNode {},
288+ Labels : make (map [string ]string ),
289+ IP : container .NetworkSettings .IPAddress ,
290+ IP6LinkLocal : container .NetworkSettings .LinkLocalIPv6Address ,
291+ IP6Global : container .NetworkSettings .GlobalIPv6Address ,
292+ }
293+ for k , v := range container .NetworkSettings .Ports {
294+ address := Address {
295+ IP : container .NetworkSettings .IPAddress ,
296+ IP6LinkLocal : container .NetworkSettings .LinkLocalIPv6Address ,
297+ IP6Global : container .NetworkSettings .GlobalIPv6Address ,
298+ Port : k .Port (),
299+ Proto : k .Proto (),
300+ }
301+ if len (v ) > 0 {
302+ address .HostPort = v [0 ].HostPort
303+ address .HostIP = v [0 ].HostIP
304+ }
305+ runtimeContainer .Addresses = append (runtimeContainer .Addresses ,
306+ address )
307+
308+ }
309+ for k , v := range container .NetworkSettings .Networks {
310+ network := Network {
311+ IP : v .IPAddress ,
312+ Name : k ,
313+ Gateway : v .Gateway ,
314+ EndpointID : v .EndpointID ,
315+ IPv6Gateway : v .IPv6Gateway ,
316+ GlobalIPv6Address : v .GlobalIPv6Address ,
317+ MacAddress : v .MacAddress ,
318+ GlobalIPv6PrefixLen : v .GlobalIPv6PrefixLen ,
319+ IPPrefixLen : v .IPPrefixLen ,
320+ }
321+
322+ runtimeContainer .Networks = append (runtimeContainer .Networks ,
323+ network )
324+ }
325+ for k , v := range container .Volumes {
326+ runtimeContainer .Volumes [k ] = Volume {
327+ Path : k ,
328+ HostPath : v ,
329+ ReadWrite : container .VolumesRW [k ],
330+ }
331+ }
332+ if container .Node != nil {
333+ runtimeContainer .Node .ID = container .Node .ID
334+ runtimeContainer .Node .Name = container .Node .Name
335+ runtimeContainer .Node .Address = Address {
336+ IP : container .Node .IP ,
337+ }
338+ }
339+
340+ runtimeContainer .Env = splitKeyValueSlice (container .Config .Env )
341+ runtimeContainer .Labels = container .Config .Labels
342+ containers = append (containers , runtimeContainer )
343+ }
344+ return containers , nil
345+
346+ }
0 commit comments