go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/docker.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package resources 5 6 import ( 7 "context" 8 "os" 9 10 docker_types "github.com/docker/docker/api/types" 11 "github.com/docker/docker/client" 12 "go.mondoo.com/cnquery/llx" 13 "go.mondoo.com/cnquery/types" 14 ) 15 16 func (p *mqlDocker) images() ([]interface{}, error) { 17 cl, err := dockerClient() 18 if err != nil { 19 return nil, err 20 } 21 22 dImages, err := cl.ImageList(context.Background(), docker_types.ImageListOptions{}) 23 if err != nil { 24 return nil, err 25 } 26 27 imgs := make([]interface{}, len(dImages)) 28 for i, dImg := range dImages { 29 labels := make(map[string]interface{}) 30 for key := range dImg.Labels { 31 labels[key] = dImg.Labels[key] 32 } 33 34 tags := []interface{}{} 35 for i := range dImg.RepoTags { 36 tags = append(tags, dImg.RepoTags[i]) 37 } 38 39 r, err := CreateResource(p.MqlRuntime, "docker.image", map[string]*llx.RawData{ 40 "id": llx.StringData(dImg.ID), 41 "size": llx.IntData(dImg.Size), 42 "virtualsize": llx.IntData(dImg.VirtualSize), 43 "labels": llx.MapData(labels, types.String), 44 "tags": llx.ArrayData(tags, types.String), 45 }) 46 if err != nil { 47 return nil, err 48 } 49 50 imgs[i] = r.(*mqlDockerImage) 51 } 52 53 return imgs, nil 54 } 55 56 func (p *mqlDocker) containers() ([]interface{}, error) { 57 cl, err := dockerClient() 58 if err != nil { 59 return nil, err 60 } 61 62 dContainers, err := cl.ContainerList(context.Background(), docker_types.ContainerListOptions{}) 63 if err != nil { 64 return nil, err 65 } 66 67 container := make([]interface{}, len(dContainers)) 68 69 for i, dContainer := range dContainers { 70 labels := make(map[string]interface{}) 71 for key := range dContainer.Labels { 72 labels[key] = dContainer.Labels[key] 73 } 74 75 names := []interface{}{} 76 for i := range dContainer.Names { 77 names = append(names, dContainer.Names[i]) 78 } 79 80 /* 81 FIXME: ??? not used? 82 conn, err := connection.NewDockerEngineContainer(dContainer.ID) 83 if err != nil { 84 return nil, err 85 } 86 */ 87 88 o, err := CreateResource(p.MqlRuntime, "docker.container", map[string]*llx.RawData{ 89 "id": llx.StringData(dContainer.ID), 90 "image": llx.StringData(dContainer.Image), 91 "imageid": llx.StringData(dContainer.ImageID), 92 "command": llx.StringData(dContainer.Command), 93 "state": llx.StringData(dContainer.State), 94 "status": llx.StringData(dContainer.Status), 95 "labels": llx.MapData(labels, types.String), 96 "names": llx.ArrayData(names, types.String), 97 }) 98 if err != nil { 99 return nil, err 100 } 101 102 container[i] = o.(*mqlDockerContainer) 103 } 104 105 return container, nil 106 } 107 108 func (p *mqlDockerContainer) os() (*mqlOsLinux, error) { 109 res, err := CreateResource(p.MqlRuntime, "os.linux", map[string]*llx.RawData{}) 110 if err != nil { 111 return nil, err 112 } 113 return res.(*mqlOsLinux), nil 114 } 115 116 func (p *mqlDockerImage) id() (string, error) { 117 return p.Id.Data, nil 118 } 119 120 func (p *mqlDockerContainer) id() (string, error) { 121 return p.Id.Data, nil 122 } 123 124 func dockerClient() (*client.Client, error) { 125 // set docker api version for macos 126 os.Setenv("DOCKER_API_VERSION", "1.26") 127 // Start new docker container 128 return client.NewClientWithOpts(client.FromEnv) 129 }