mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
407a626be6
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>
129 lines
3.4 KiB
Go
129 lines
3.4 KiB
Go
package daemon
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/docker/docker/api/types"
|
|
)
|
|
|
|
func (daemon *Daemon) ContainerInspect(name string) (*types.ContainerJSON, error) {
|
|
container, err := daemon.Get(name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
container.Lock()
|
|
defer container.Unlock()
|
|
|
|
base, err := daemon.getInspectData(container)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &types.ContainerJSON{base, container.Config}, nil
|
|
}
|
|
|
|
func (daemon *Daemon) ContainerInspectRaw(name string) (*types.ContainerJSONRaw, error) {
|
|
container, err := daemon.Get(name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
container.Lock()
|
|
defer container.Unlock()
|
|
|
|
base, err := daemon.getInspectData(container)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
config := &types.ContainerConfig{
|
|
container.Config,
|
|
container.hostConfig.Memory,
|
|
container.hostConfig.MemorySwap,
|
|
container.hostConfig.CpuShares,
|
|
container.hostConfig.CpusetCpus,
|
|
}
|
|
|
|
return &types.ContainerJSONRaw{base, config}, nil
|
|
}
|
|
|
|
func (daemon *Daemon) getInspectData(container *Container) (*types.ContainerJSONBase, error) {
|
|
// make a copy to play with
|
|
hostConfig := *container.hostConfig
|
|
|
|
if children, err := daemon.Children(container.Name); err == nil {
|
|
for linkAlias, child := range children {
|
|
hostConfig.Links = append(hostConfig.Links, fmt.Sprintf("%s:%s", child.Name, linkAlias))
|
|
}
|
|
}
|
|
// we need this trick to preserve empty log driver, so
|
|
// container will use daemon defaults even if daemon change them
|
|
if hostConfig.LogConfig.Type == "" {
|
|
hostConfig.LogConfig = daemon.defaultLogConfig
|
|
}
|
|
|
|
containerState := &types.ContainerState{
|
|
Running: container.State.Running,
|
|
Paused: container.State.Paused,
|
|
Restarting: container.State.Restarting,
|
|
OOMKilled: container.State.OOMKilled,
|
|
Dead: container.State.Dead,
|
|
Pid: container.State.Pid,
|
|
ExitCode: container.State.ExitCode,
|
|
Error: container.State.Error,
|
|
StartedAt: container.State.StartedAt,
|
|
FinishedAt: container.State.FinishedAt,
|
|
}
|
|
|
|
volumes := make(map[string]string)
|
|
volumesRW := make(map[string]bool)
|
|
|
|
for _, m := range container.MountPoints {
|
|
volumes[m.Destination] = m.Path()
|
|
volumesRW[m.Destination] = m.RW
|
|
}
|
|
|
|
contJSONBase := &types.ContainerJSONBase{
|
|
Id: container.ID,
|
|
Created: container.Created,
|
|
Path: container.Path,
|
|
Args: container.Args,
|
|
State: containerState,
|
|
Image: container.ImageID,
|
|
NetworkSettings: container.NetworkSettings,
|
|
ResolvConfPath: container.ResolvConfPath,
|
|
HostnamePath: container.HostnamePath,
|
|
HostsPath: container.HostsPath,
|
|
LogPath: container.LogPath,
|
|
Name: container.Name,
|
|
RestartCount: container.RestartCount,
|
|
Driver: container.Driver,
|
|
ExecDriver: container.ExecDriver,
|
|
MountLabel: container.MountLabel,
|
|
ProcessLabel: container.ProcessLabel,
|
|
Volumes: volumes,
|
|
VolumesRW: volumesRW,
|
|
AppArmorProfile: container.AppArmorProfile,
|
|
ExecIDs: container.GetExecIDs(),
|
|
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
|
|
}
|
|
|
|
func (daemon *Daemon) ContainerExecInspect(id string) (*execConfig, error) {
|
|
eConfig, err := daemon.getExecConfig(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return eConfig, nil
|
|
}
|