mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
docker-inspect: Extend docker inspect to export image/container metadata related to graph driver
Export image/container metadata stored in graph driver. Right now 3 fields DeviceId, DeviceSize and DeviceName are being exported from devicemapper. Other graph drivers can export fields as they see fit. This data can be used to mount the thin device outside of docker and tools can look into image/container and do some kind of inspection. Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
This commit is contained in:
parent
1157fcc4a4
commit
407a626be6
14 changed files with 353 additions and 205 deletions
|
@ -75,6 +75,11 @@ type Image struct {
|
||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GraphDriverData struct {
|
||||||
|
Name string
|
||||||
|
Data map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
// GET "/images/{name:.*}/json"
|
// GET "/images/{name:.*}/json"
|
||||||
type ImageInspect struct {
|
type ImageInspect struct {
|
||||||
Id string
|
Id string
|
||||||
|
@ -90,6 +95,7 @@ type ImageInspect struct {
|
||||||
Os string
|
Os string
|
||||||
Size int64
|
Size int64
|
||||||
VirtualSize int64
|
VirtualSize int64
|
||||||
|
GraphDriver GraphDriverData
|
||||||
}
|
}
|
||||||
|
|
||||||
// GET "/containers/json"
|
// GET "/containers/json"
|
||||||
|
@ -218,6 +224,7 @@ type ContainerJSONBase struct {
|
||||||
AppArmorProfile string
|
AppArmorProfile string
|
||||||
ExecIDs []string
|
ExecIDs []string
|
||||||
HostConfig *runconfig.HostConfig
|
HostConfig *runconfig.HostConfig
|
||||||
|
GraphDriver GraphDriverData
|
||||||
}
|
}
|
||||||
|
|
||||||
type ContainerJSON struct {
|
type ContainerJSON struct {
|
||||||
|
|
|
@ -162,6 +162,10 @@ func (a *Driver) Status() [][2]string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *Driver) GetMetadata(id string) (map[string]string, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Exists returns true if the given id is registered with
|
// Exists returns true if the given id is registered with
|
||||||
// this driver
|
// this driver
|
||||||
func (a *Driver) Exists(id string) bool {
|
func (a *Driver) Exists(id string) bool {
|
||||||
|
|
|
@ -70,6 +70,10 @@ func (d *Driver) Status() [][2]string {
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Cleanup() error {
|
func (d *Driver) Cleanup() error {
|
||||||
return mount.Unmount(d.home)
|
return mount.Unmount(d.home)
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,6 +127,13 @@ type Status struct {
|
||||||
DeferredRemoveEnabled bool
|
DeferredRemoveEnabled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Structure used to export image/container metadata in docker inspect.
|
||||||
|
type DeviceMetadata struct {
|
||||||
|
deviceId int
|
||||||
|
deviceSize uint64 // size in bytes
|
||||||
|
deviceName string // Device name as used during activation
|
||||||
|
}
|
||||||
|
|
||||||
type DevStatus struct {
|
type DevStatus struct {
|
||||||
DeviceId int
|
DeviceId int
|
||||||
Size uint64
|
Size uint64
|
||||||
|
@ -1700,6 +1707,20 @@ func (devices *DeviceSet) Status() *Status {
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Status returns the current status of this deviceset
|
||||||
|
func (devices *DeviceSet) ExportDeviceMetadata(hash string) (*DeviceMetadata, error) {
|
||||||
|
info, err := devices.lookupDevice(hash)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
info.lock.Lock()
|
||||||
|
defer info.lock.Unlock()
|
||||||
|
|
||||||
|
metadata := &DeviceMetadata{info.DeviceId, info.Size, info.Name()}
|
||||||
|
return metadata, nil
|
||||||
|
}
|
||||||
|
|
||||||
func NewDeviceSet(root string, doInit bool, options []string) (*DeviceSet, error) {
|
func NewDeviceSet(root string, doInit bool, options []string) (*DeviceSet, error) {
|
||||||
devicemapper.SetDevDir("/dev")
|
devicemapper.SetDevDir("/dev")
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
"github.com/Sirupsen/logrus"
|
||||||
"github.com/docker/docker/daemon/graphdriver"
|
"github.com/docker/docker/daemon/graphdriver"
|
||||||
|
@ -91,6 +92,20 @@ func (d *Driver) Status() [][2]string {
|
||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
||||||
|
m, err := d.DeviceSet.ExportDeviceMetadata(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata := make(map[string]string)
|
||||||
|
metadata["DeviceId"] = strconv.Itoa(m.deviceId)
|
||||||
|
metadata["DeviceSize"] = strconv.FormatUint(m.deviceSize, 10)
|
||||||
|
metadata["DeviceName"] = m.deviceName
|
||||||
|
return metadata, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Cleanup() error {
|
func (d *Driver) Cleanup() error {
|
||||||
err := d.DeviceSet.Shutdown()
|
err := d.DeviceSet.Shutdown()
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,9 @@ type ProtoDriver interface {
|
||||||
// Status returns a set of key-value pairs which give low
|
// Status returns a set of key-value pairs which give low
|
||||||
// level diagnostic status about this driver.
|
// level diagnostic status about this driver.
|
||||||
Status() [][2]string
|
Status() [][2]string
|
||||||
|
// Returns a set of key-value pairs which give low level information
|
||||||
|
// about the image/container driver is managing.
|
||||||
|
GetMetadata(id string) (map[string]string, error)
|
||||||
// Cleanup performs necessary tasks to release resources
|
// Cleanup performs necessary tasks to release resources
|
||||||
// held by the driver, e.g., unmounting all layered filesystems
|
// held by the driver, e.g., unmounting all layered filesystems
|
||||||
// known to this driver.
|
// known to this driver.
|
||||||
|
|
|
@ -167,6 +167,10 @@ func (d *Driver) Status() [][2]string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Cleanup() error {
|
func (d *Driver) Cleanup() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,10 @@ func (d *Driver) Status() [][2]string {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) Cleanup() error {
|
func (d *Driver) Cleanup() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -186,6 +186,10 @@ func (d *Driver) Status() [][2]string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) cloneFilesystem(name, parentName string) error {
|
func (d *Driver) cloneFilesystem(name, parentName string) error {
|
||||||
snapshotName := fmt.Sprintf("%d", time.Now().Nanosecond())
|
snapshotName := fmt.Sprintf("%d", time.Now().Nanosecond())
|
||||||
parentDataset := zfs.Dataset{Name: parentName}
|
parentDataset := zfs.Dataset{Name: parentName}
|
||||||
|
|
|
@ -109,6 +109,13 @@ func (daemon *Daemon) getInspectData(container *Container) (*types.ContainerJSON
|
||||||
HostConfig: &hostConfig,
|
HostConfig: &hostConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
contJSONBase.GraphDriver.Name = container.Driver
|
||||||
|
graphDriverData, err := daemon.driver.GetMetadata(container.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
contJSONBase.GraphDriver.Data = graphDriverData
|
||||||
|
|
||||||
return contJSONBase, nil
|
return contJSONBase, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,13 @@ func (s *TagStore) Lookup(name string) (*types.ImageInspect, error) {
|
||||||
VirtualSize: s.graph.GetParentsSize(image, 0) + image.Size,
|
VirtualSize: s.graph.GetParentsSize(image, 0) + image.Size,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
imageInspect.GraphDriver.Name = s.graph.driver.String()
|
||||||
|
|
||||||
|
graphDriverData, err := s.graph.driver.GetMetadata(image.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
imageInspect.GraphDriver.Data = graphDriverData
|
||||||
return imageInspect, nil
|
return imageInspect, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ func (s *DockerSuite) TestInspectApiContainerResponse(c *check.C) {
|
||||||
c.Fatalf("unable to unmarshal body for latest version: %v", err)
|
c.Fatalf("unable to unmarshal body for latest version: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
keys := []string{"State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings", "ResolvConfPath", "HostnamePath", "HostsPath", "LogPath", "Name", "Driver", "ExecDriver", "MountLabel", "ProcessLabel", "Volumes", "VolumesRW"}
|
keys := []string{"State", "Created", "Path", "Args", "Config", "Image", "NetworkSettings", "ResolvConfPath", "HostnamePath", "HostsPath", "LogPath", "Name", "Driver", "ExecDriver", "MountLabel", "ProcessLabel", "Volumes", "VolumesRW", "GraphDriver"}
|
||||||
|
|
||||||
keys = append(keys, "Id")
|
keys = append(keys, "Id")
|
||||||
|
|
||||||
|
|
|
@ -89,3 +89,70 @@ func (s *DockerSuite) TestInspectContainerFilterInt(c *check.C) {
|
||||||
c.Fatalf("Expected exitcode: %d for container: %s", exitCode, id)
|
c.Fatalf("Expected exitcode: %d for container: %s", exitCode, id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *DockerSuite) TestInspectImageGraphDriver(c *check.C) {
|
||||||
|
imageTest := "emptyfs"
|
||||||
|
name, err := inspectField(imageTest, "GraphDriver.Name")
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
if name != "devicemapper" && name != "overlay" && name != "vfs" && name != "zfs" && name != "btrfs" && name != "aufs" {
|
||||||
|
c.Fatalf("%v is not a valid graph driver name", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if name != "devicemapper" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceId, err := inspectField(imageTest, "GraphDriver.Data.DeviceId")
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
_, err = strconv.Atoi(deviceId)
|
||||||
|
if err != nil {
|
||||||
|
c.Fatalf("failed to inspect DeviceId of the image: %s, %v", deviceId, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceSize, err := inspectField(imageTest, "GraphDriver.Data.DeviceSize")
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
_, err = strconv.ParseUint(deviceSize, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
c.Fatalf("failed to inspect DeviceSize of the image: %s, %v", deviceSize, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *DockerSuite) TestInspectContainerGraphDriver(c *check.C) {
|
||||||
|
runCmd := exec.Command(dockerBinary, "run", "-d", "busybox", "true")
|
||||||
|
out, _, _, err := runCommandWithStdoutStderr(runCmd)
|
||||||
|
if err != nil {
|
||||||
|
c.Fatalf("failed to run container: %v, output: %q", err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
out = strings.TrimSpace(out)
|
||||||
|
|
||||||
|
name, err := inspectField(out, "GraphDriver.Name")
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
if name != "devicemapper" && name != "overlay" && name != "vfs" && name != "zfs" && name != "btrfs" && name != "aufs" {
|
||||||
|
c.Fatalf("%v is not a valid graph driver name", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if name != "devicemapper" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceId, err := inspectField(out, "GraphDriver.Data.DeviceId")
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
_, err = strconv.Atoi(deviceId)
|
||||||
|
if err != nil {
|
||||||
|
c.Fatalf("failed to inspect DeviceId of the image: %s, %v", deviceId, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceSize, err := inspectField(out, "GraphDriver.Data.DeviceSize")
|
||||||
|
c.Assert(err, check.IsNil)
|
||||||
|
|
||||||
|
_, err = strconv.ParseUint(deviceSize, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
c.Fatalf("failed to inspect DeviceSize of the image: %s, %v", deviceSize, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -30,143 +30,144 @@ each result.
|
||||||
|
|
||||||
To get information on a container use its ID or instance name:
|
To get information on a container use its ID or instance name:
|
||||||
|
|
||||||
$ docker inspect 1eb5fabf5a03
|
$ docker inspect d2cc496561d6
|
||||||
[{
|
[{
|
||||||
"AppArmorProfile": "",
|
"Id": "d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47",
|
||||||
"Args": [],
|
"Created": "2015-06-08T16:18:02.505155285Z",
|
||||||
"Config": {
|
"Path": "bash",
|
||||||
"AttachStderr": false,
|
"Args": [],
|
||||||
"AttachStdin": false,
|
"State": {
|
||||||
"AttachStdout": false,
|
"Running": false,
|
||||||
"Cmd": [
|
"Paused": false,
|
||||||
"/usr/sbin/nginx"
|
"Restarting": false,
|
||||||
],
|
"OOMKilled": false,
|
||||||
"Domainname": "",
|
"Dead": false,
|
||||||
"Entrypoint": null,
|
"Pid": 0,
|
||||||
"Env": [
|
"ExitCode": 0,
|
||||||
"HOME=/",
|
"Error": "",
|
||||||
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
"StartedAt": "2015-06-08T16:18:03.643865954Z",
|
||||||
],
|
"FinishedAt": "2015-06-08T16:57:06.448552862Z"
|
||||||
"ExposedPorts": {
|
},
|
||||||
"80/tcp": {}
|
"Image": "ded7cd95e059788f2586a51c275a4f151653779d6a7f4dad77c2bd34601d94e4",
|
||||||
},
|
"NetworkSettings": {
|
||||||
"Hostname": "1eb5fabf5a03",
|
"Bridge": "",
|
||||||
"Image": "summit/nginx",
|
"EndpointID": "",
|
||||||
"Labels": {
|
"Gateway": "",
|
||||||
"com.example.vendor": "Acme",
|
"GlobalIPv6Address": "",
|
||||||
"com.example.license": "GPL",
|
"GlobalIPv6PrefixLen": 0,
|
||||||
"com.example.version": "1.0"
|
"HairpinMode": false,
|
||||||
},
|
"IPAddress": "",
|
||||||
"MacAddress": "",
|
"IPPrefixLen": 0,
|
||||||
"NetworkDisabled": false,
|
"IPv6Gateway": "",
|
||||||
"OnBuild": null,
|
"LinkLocalIPv6Address": "",
|
||||||
"OpenStdin": false,
|
"LinkLocalIPv6PrefixLen": 0,
|
||||||
"StdinOnce": false,
|
"MacAddress": "",
|
||||||
"Tty": true,
|
"NetworkID": "",
|
||||||
"User": "",
|
"PortMapping": null,
|
||||||
"Volumes": null,
|
"Ports": null,
|
||||||
"WorkingDir": "",
|
"SandboxKey": "",
|
||||||
|
"SecondaryIPAddresses": null,
|
||||||
|
"SecondaryIPv6Addresses": null
|
||||||
|
},
|
||||||
|
"ResolvConfPath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/resolv.conf",
|
||||||
|
"HostnamePath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/hostname",
|
||||||
|
"HostsPath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/hosts",
|
||||||
|
"LogPath": "/var/lib/docker/containers/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47/d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47-json.log",
|
||||||
|
"Name": "/adoring_wozniak",
|
||||||
|
"RestartCount": 0,
|
||||||
|
"Driver": "devicemapper",
|
||||||
|
"ExecDriver": "native-0.2",
|
||||||
|
"MountLabel": "",
|
||||||
|
"ProcessLabel": "",
|
||||||
|
"Volumes": {},
|
||||||
|
"VolumesRW": {},
|
||||||
|
"AppArmorProfile": "",
|
||||||
|
"ExecIDs": null,
|
||||||
|
"HostConfig": {
|
||||||
|
"Binds": null,
|
||||||
|
"ContainerIDFile": "",
|
||||||
|
"LxcConf": [],
|
||||||
|
"Memory": 0,
|
||||||
|
"MemorySwap": 0,
|
||||||
|
"CpuShares": 0,
|
||||||
|
"CpuPeriod": 0,
|
||||||
|
"CpusetCpus": "",
|
||||||
|
"CpusetMems": "",
|
||||||
|
"CpuQuota": 0,
|
||||||
|
"BlkioWeight": 0,
|
||||||
|
"OomKillDisable": false,
|
||||||
|
"Privileged": false,
|
||||||
|
"PortBindings": {},
|
||||||
|
"Links": null,
|
||||||
|
"PublishAllPorts": false,
|
||||||
|
"Dns": null,
|
||||||
|
"DnsSearch": null,
|
||||||
|
"ExtraHosts": null,
|
||||||
|
"VolumesFrom": null,
|
||||||
|
"Devices": [],
|
||||||
|
"NetworkMode": "bridge",
|
||||||
|
"IpcMode": "",
|
||||||
|
"PidMode": "",
|
||||||
|
"UTSMode": "",
|
||||||
|
"CapAdd": null,
|
||||||
|
"CapDrop": null,
|
||||||
|
"RestartPolicy": {
|
||||||
|
"Name": "no",
|
||||||
|
"MaximumRetryCount": 0
|
||||||
},
|
},
|
||||||
"Created": "2014-04-04T21:33:52.02361335Z",
|
"SecurityOpt": null,
|
||||||
"Driver": "devicemapper",
|
"ReadonlyRootfs": false,
|
||||||
"ExecDriver": "native-0.1",
|
"Ulimits": null,
|
||||||
"ExecIDs": null,
|
"LogConfig": {
|
||||||
"HostConfig": {
|
"Type": "json-file",
|
||||||
"Binds": null,
|
"Config": {}
|
||||||
"CapAdd": null,
|
},
|
||||||
"CapDrop": null,
|
"CgroupParent": ""
|
||||||
"CgroupParent": "",
|
},
|
||||||
"ContainerIDFile": "",
|
"GraphDriver": {
|
||||||
"CpuShares": 512,
|
"Name": "devicemapper",
|
||||||
"CpusetCpus": "0,1",
|
"Data": {
|
||||||
"CpusetMems": "",
|
"DeviceId": "5",
|
||||||
"Devices": [],
|
"DeviceName": "docker-253:1-2763198-d2cc496561d6d520cbc0236b4ba88c362c446a7619992123f11c809cded25b47",
|
||||||
"Dns": null,
|
"DeviceSize": "171798691840"
|
||||||
"DnsSearch": null,
|
|
||||||
"ExtraHosts": null,
|
|
||||||
"IpcMode": "",
|
|
||||||
"Links": null,
|
|
||||||
"LogConfig": {
|
|
||||||
"Config": null,
|
|
||||||
"Type": "json-file"
|
|
||||||
},
|
|
||||||
"LxcConf": null,
|
|
||||||
"Memory": 16777216,
|
|
||||||
"MemorySwap": -1,
|
|
||||||
"NetworkMode": "",
|
|
||||||
"PidMode": "",
|
|
||||||
"PortBindings": {
|
|
||||||
"80/tcp": [
|
|
||||||
{
|
|
||||||
"HostIp": "0.0.0.0",
|
|
||||||
"HostPort": "80"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"Privileged": false,
|
|
||||||
"PublishAllPorts": false,
|
|
||||||
"ReadonlyRootfs": false,
|
|
||||||
"RestartPolicy": {
|
|
||||||
"MaximumRetryCount": 0,
|
|
||||||
"Name": ""
|
|
||||||
},
|
|
||||||
"SecurityOpt": null,
|
|
||||||
"Ulimits": null,
|
|
||||||
"VolumesFrom": null
|
|
||||||
}
|
}
|
||||||
"HostnamePath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/hostname",
|
},
|
||||||
"HostsPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/hosts",
|
"Config": {
|
||||||
"ID": "1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b",
|
"Hostname": "d2cc496561d6",
|
||||||
"Image": "df53773a4390e25936f9fd3739e0c0e60a62d024ea7b669282b27e65ae8458e6",
|
"Domainname": "",
|
||||||
"LogPath": "/var/lib/docker/containers/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b/1eb5fabf5a03807136561b3c00adcd2992b535d624d5e18b6cdc6a6844d9767b-json.log",
|
"User": "",
|
||||||
"MountLabel": "",
|
"AttachStdin": true,
|
||||||
"Name": "/ecstatic_ptolemy",
|
"AttachStdout": true,
|
||||||
"NetworkSettings": {
|
"AttachStderr": true,
|
||||||
"Bridge": "docker0",
|
"ExposedPorts": null,
|
||||||
"Gateway": "172.17.42.1",
|
"Tty": true,
|
||||||
"GlobalIPv6Address": "",
|
"OpenStdin": true,
|
||||||
"GlobalIPv6PrefixLen": 0,
|
"StdinOnce": true,
|
||||||
"IPAddress": "172.17.0.2",
|
"Env": null,
|
||||||
"IPPrefixLen": 16,
|
"Cmd": [
|
||||||
"IPv6Gateway": "",
|
"bash"
|
||||||
"LinkLocalIPv6Address": "",
|
],
|
||||||
"LinkLocalIPv6PrefixLen": 0,
|
"Image": "fedora",
|
||||||
"MacAddress": "",
|
"Volumes": null,
|
||||||
"PortMapping": null,
|
"VolumeDriver": "",
|
||||||
"Ports": {
|
"WorkingDir": "",
|
||||||
"80/tcp": [
|
"Entrypoint": null,
|
||||||
{
|
"NetworkDisabled": false,
|
||||||
"HostIp": "0.0.0.0",
|
"MacAddress": "",
|
||||||
"HostPort": "80"
|
"OnBuild": null,
|
||||||
}
|
"Labels": {},
|
||||||
]
|
"Memory": 0,
|
||||||
}
|
"MemorySwap": 0,
|
||||||
},
|
"CpuShares": 0,
|
||||||
"Path": "/usr/sbin/nginx",
|
"Cpuset": ""
|
||||||
"ProcessLabel": "",
|
|
||||||
"ResolvConfPath": "/etc/resolv.conf",
|
|
||||||
"RestartCount": 0,
|
|
||||||
"State": {
|
|
||||||
"Dead": false,
|
|
||||||
"Error": "",
|
|
||||||
"ExitCode": 0,
|
|
||||||
"FinishedAt": "0001-01-01T00:00:00Z",
|
|
||||||
"OOMKilled": false,
|
|
||||||
"Paused": false,
|
|
||||||
"Pid": 858,
|
|
||||||
"Restarting": false,
|
|
||||||
"Running": true,
|
|
||||||
"StartedAt": "2014-04-04T21:33:54.16259207Z",
|
|
||||||
},
|
|
||||||
"Volumes": {},
|
|
||||||
"VolumesRW": {},
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
## Getting the IP address of a container instance
|
## Getting the IP address of a container instance
|
||||||
|
|
||||||
To get the IP address of a container use:
|
To get the IP address of a container use:
|
||||||
|
|
||||||
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' 1eb5fabf5a03
|
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' d2cc496561d6
|
||||||
172.17.0.2
|
172.17.0.2
|
||||||
|
|
||||||
## Listing all port bindings
|
## Listing all port bindings
|
||||||
|
@ -175,7 +176,7 @@ One can loop over arrays and maps in the results to produce simple text
|
||||||
output:
|
output:
|
||||||
|
|
||||||
$ docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} \
|
$ docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} \
|
||||||
{{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 1eb5fabf5a03
|
{{$p}} -> {{(index $conf 0).HostPort}} {{end}}' d2cc496561d6
|
||||||
80/tcp -> 80
|
80/tcp -> 80
|
||||||
|
|
||||||
You can get more information about how to write a go template from:
|
You can get more information about how to write a go template from:
|
||||||
|
@ -186,79 +187,79 @@ http://golang.org/pkg/text/template/.
|
||||||
Use an image's ID or name (e.g., repository/name[:tag]) to get information
|
Use an image's ID or name (e.g., repository/name[:tag]) to get information
|
||||||
on it.
|
on it.
|
||||||
|
|
||||||
$ docker inspect fc1203419df2
|
$ docker inspect ded7cd95e059
|
||||||
[{
|
[{
|
||||||
"Architecture": "amd64",
|
"Id": "ded7cd95e059788f2586a51c275a4f151653779d6a7f4dad77c2bd34601d94e4",
|
||||||
"Author": "",
|
"Parent": "48ecf305d2cf7046c1f5f8fcbcd4994403173441d4a7f125b1bb0ceead9de731",
|
||||||
"Comment": "",
|
"Comment": "",
|
||||||
"Config": {
|
"Created": "2015-05-27T16:58:22.937503085Z",
|
||||||
"AttachStderr": false,
|
"Container": "76cf7f67d83a7a047454b33007d03e32a8f474ad332c3a03c94537edd22b312b",
|
||||||
"AttachStdin": false,
|
"ContainerConfig": {
|
||||||
"AttachStdout": false,
|
"Hostname": "76cf7f67d83a",
|
||||||
"Cmd": [
|
"Domainname": "",
|
||||||
"make",
|
"User": "",
|
||||||
"direct-test"
|
"AttachStdin": false,
|
||||||
],
|
"AttachStdout": false,
|
||||||
"Domainname": "",
|
"AttachStderr": false,
|
||||||
"Entrypoint": [
|
"ExposedPorts": null,
|
||||||
"/dind"
|
"Tty": false,
|
||||||
],
|
"OpenStdin": false,
|
||||||
"Env": [
|
"StdinOnce": false,
|
||||||
"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
"Env": null,
|
||||||
],
|
"Cmd": [
|
||||||
"ExposedPorts": null,
|
"/bin/sh",
|
||||||
"Hostname": "242978536a06",
|
"-c",
|
||||||
"Image": "c2b774c744afc5bea603b5e6c5218539e506649326de3ea0135182f299d0519a",
|
"#(nop) ADD file:4be46382bcf2b095fcb9fe8334206b584eff60bb3fad8178cbd97697fcb2ea83 in /"
|
||||||
"Labels": {},
|
],
|
||||||
"MacAddress": "",
|
"Image": "48ecf305d2cf7046c1f5f8fcbcd4994403173441d4a7f125b1bb0ceead9de731",
|
||||||
"NetworkDisabled": false,
|
"Volumes": null,
|
||||||
"OnBuild": [],
|
"VolumeDriver": "",
|
||||||
"OpenStdin": false,
|
"WorkingDir": "",
|
||||||
"StdinOnce": false,
|
"Entrypoint": null,
|
||||||
"Tty": false,
|
"NetworkDisabled": false,
|
||||||
"User": "",
|
"MacAddress": "",
|
||||||
"Volumes": null,
|
"OnBuild": null,
|
||||||
"WorkingDir": "/go/src/github.com/docker/libcontainer"
|
"Labels": {}
|
||||||
},
|
},
|
||||||
"Container": "1c00417f3812a96d3ebc29e7fdee69f3d586d703ab89c8233fd4678d50707b39",
|
"DockerVersion": "1.6.0",
|
||||||
"ContainerConfig": {
|
"Author": "Lokesh Mandvekar \u003clsm5@fedoraproject.org\u003e",
|
||||||
"AttachStderr": false,
|
"Config": {
|
||||||
"AttachStdin": false,
|
"Hostname": "76cf7f67d83a",
|
||||||
"AttachStdout": false,
|
"Domainname": "",
|
||||||
"Cmd": [
|
"User": "",
|
||||||
"/bin/sh",
|
"AttachStdin": false,
|
||||||
"-c",
|
"AttachStdout": false,
|
||||||
"#(nop) CMD [\"make\" \"direct-test\"]"
|
"AttachStderr": false,
|
||||||
],
|
"ExposedPorts": null,
|
||||||
"Domainname": "",
|
"Tty": false,
|
||||||
"Entrypoint": [
|
"OpenStdin": false,
|
||||||
"/dind"
|
"StdinOnce": false,
|
||||||
],
|
"Env": null,
|
||||||
"Env": [
|
"Cmd": null,
|
||||||
"PATH=/go/bin:/usr/src/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
|
"Image": "48ecf305d2cf7046c1f5f8fcbcd4994403173441d4a7f125b1bb0ceead9de731",
|
||||||
],
|
"Volumes": null,
|
||||||
"ExposedPorts": null,
|
"VolumeDriver": "",
|
||||||
"Hostname": "242978536a06",
|
"WorkingDir": "",
|
||||||
"Image": "c2b774c744afc5bea603b5e6c5218539e506649326de3ea0135182f299d0519a",
|
"Entrypoint": null,
|
||||||
"Labels": {},
|
"NetworkDisabled": false,
|
||||||
"MacAddress": "",
|
"MacAddress": "",
|
||||||
"NetworkDisabled": false,
|
"OnBuild": null,
|
||||||
"OnBuild": [],
|
"Labels": {}
|
||||||
"OpenStdin": false,
|
},
|
||||||
"StdinOnce": false,
|
"Architecture": "amd64",
|
||||||
"Tty": false,
|
"Os": "linux",
|
||||||
"User": "",
|
"Size": 186507296,
|
||||||
"Volumes": null,
|
"VirtualSize": 186507296,
|
||||||
"WorkingDir": "/go/src/github.com/docker/libcontainer"
|
"GraphDriver": {
|
||||||
},
|
"Name": "devicemapper",
|
||||||
"Created": "2015-04-07T05:34:39.079489206Z",
|
"Data": {
|
||||||
"DockerVersion": "1.5.0-dev",
|
"DeviceId": "3",
|
||||||
"Id": "fc1203419df26ca82cad1dd04c709cb1b8a8a947bd5bcbdfbef8241a76f031db",
|
"DeviceName": "docker-253:1-2763198-ded7cd95e059788f2586a51c275a4f151653779d6a7f4dad77c2bd34601d94e4",
|
||||||
"Os": "linux",
|
"DeviceSize": "171798691840"
|
||||||
"Parent": "c2b774c744afc5bea603b5e6c5218539e506649326de3ea0135182f299d0519a",
|
}
|
||||||
"Size": 0,
|
}
|
||||||
"VirtualSize": 613136466
|
}
|
||||||
}]
|
]
|
||||||
|
|
||||||
# HISTORY
|
# HISTORY
|
||||||
April 2014, originally compiled by William Henry (whenry at redhat dot com)
|
April 2014, originally compiled by William Henry (whenry at redhat dot com)
|
||||||
|
|
Loading…
Add table
Reference in a new issue