mirror of https://github.com/docker/docs.git
Merge pull request #1146 from jimmyxian/improve-image-all
Add support images -a
This commit is contained in:
commit
83f93dff47
|
|
@ -28,7 +28,7 @@ const APIVERSION = "1.16"
|
||||||
func getInfo(c *context, w http.ResponseWriter, r *http.Request) {
|
func getInfo(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
info := dockerclient.Info{
|
info := dockerclient.Info{
|
||||||
Containers: int64(len(c.cluster.Containers())),
|
Containers: int64(len(c.cluster.Containers())),
|
||||||
Images: int64(len(c.cluster.Images())),
|
Images: int64(len(c.cluster.Images(false))),
|
||||||
DriverStatus: c.statusHandler.Status(),
|
DriverStatus: c.statusHandler.Status(),
|
||||||
NEventsListener: int64(c.eventsHandler.Size()),
|
NEventsListener: int64(c.eventsHandler.Size()),
|
||||||
Debug: c.debug,
|
Debug: c.debug,
|
||||||
|
|
@ -78,7 +78,7 @@ func getImages(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
// Create a map of engine address to the list of images it holds.
|
// Create a map of engine address to the list of images it holds.
|
||||||
engineImages := make(map[string][]*cluster.Image)
|
engineImages := make(map[string][]*cluster.Image)
|
||||||
for _, image := range c.cluster.Images() {
|
for _, image := range c.cluster.Images(true) {
|
||||||
engineImages[image.Engine.Addr] = append(engineImages[image.Engine.Addr], image)
|
engineImages[image.Engine.Addr] = append(engineImages[image.Engine.Addr], image)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -114,6 +114,8 @@ func getImagesJSON(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
all := boolValue(r, "all")
|
||||||
|
|
||||||
filters, err := dockerfilters.FromParam(r.Form.Get("filters"))
|
filters, err := dockerfilters.FromParam(r.Form.Get("filters"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
httpError(w, err.Error(), http.StatusInternalServerError)
|
httpError(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
|
@ -123,7 +125,7 @@ func getImagesJSON(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
accepteds, _ := filters["node"]
|
accepteds, _ := filters["node"]
|
||||||
images := []*cluster.Image{}
|
images := []*cluster.Image{}
|
||||||
|
|
||||||
for _, image := range c.cluster.Images() {
|
for _, image := range c.cluster.Images(all) {
|
||||||
if len(accepteds) != 0 {
|
if len(accepteds) != 0 {
|
||||||
found := false
|
found := false
|
||||||
for _, accepted := range accepteds {
|
for _, accepted := range accepteds {
|
||||||
|
|
@ -585,7 +587,7 @@ func proxyImage(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
func proxyImageTagOptional(c *context, w http.ResponseWriter, r *http.Request) {
|
func proxyImageTagOptional(c *context, w http.ResponseWriter, r *http.Request) {
|
||||||
name := mux.Vars(r)["name"]
|
name := mux.Vars(r)["name"]
|
||||||
|
|
||||||
for _, image := range c.cluster.Images() {
|
for _, image := range c.cluster.Images(true) {
|
||||||
if len(strings.SplitN(name, ":", 2)) == 2 && image.Match(name, true) ||
|
if len(strings.SplitN(name, ":", 2)) == 2 && image.Match(name, true) ||
|
||||||
len(strings.SplitN(name, ":", 2)) == 1 && image.Match(name, false) {
|
len(strings.SplitN(name, ":", 2)) == 1 && image.Match(name, false) {
|
||||||
proxy(c.tlsConfig, image.Engine.Addr, w, r)
|
proxy(c.tlsConfig, image.Engine.Addr, w, r)
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ type Cluster interface {
|
||||||
RemoveContainer(container *Container, force bool) error
|
RemoveContainer(container *Container, force bool) error
|
||||||
|
|
||||||
// Return all images
|
// Return all images
|
||||||
Images() []*Image
|
Images(all bool) []*Image
|
||||||
|
|
||||||
// Return one image matching `IDOrName`
|
// Return one image matching `IDOrName`
|
||||||
Image(IDOrName string) *Image
|
Image(IDOrName string) *Image
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ func (e *Engine) RemoveImage(image *Image, name string) ([]*dockerclient.ImageDe
|
||||||
|
|
||||||
// RefreshImages refreshes the list of images on the engine.
|
// RefreshImages refreshes the list of images on the engine.
|
||||||
func (e *Engine) RefreshImages() error {
|
func (e *Engine) RefreshImages() error {
|
||||||
images, err := e.client.ListImages(false)
|
images, err := e.client.ListImages(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -507,13 +507,15 @@ func (e *Engine) Containers() Containers {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Images returns all the images in the engine
|
// Images returns all the images in the engine
|
||||||
func (e *Engine) Images() []*Image {
|
func (e *Engine) Images(all bool) []*Image {
|
||||||
e.RLock()
|
e.RLock()
|
||||||
|
|
||||||
images := make([]*Image, 0, len(e.images))
|
images := make([]*Image, 0, len(e.images))
|
||||||
for _, image := range e.images {
|
for _, image := range e.images {
|
||||||
|
if all || (!all && len(image.RepoTags) != 0 && image.RepoTags[0] != "<none>:<none>") {
|
||||||
images = append(images, image)
|
images = append(images, image)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
e.RUnlock()
|
e.RUnlock()
|
||||||
return images
|
return images
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ func TestEngineCpusMemory(t *testing.T) {
|
||||||
client.On("Info").Return(mockInfo, nil)
|
client.On("Info").Return(mockInfo, nil)
|
||||||
client.On("Version").Return(mockVersion, nil)
|
client.On("Version").Return(mockVersion, nil)
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil)
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil)
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
|
||||||
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
||||||
|
|
||||||
assert.NoError(t, engine.ConnectWithClient(client))
|
assert.NoError(t, engine.ConnectWithClient(client))
|
||||||
|
|
@ -85,7 +85,7 @@ func TestEngineSpecs(t *testing.T) {
|
||||||
client.On("Info").Return(mockInfo, nil)
|
client.On("Info").Return(mockInfo, nil)
|
||||||
client.On("Version").Return(mockVersion, nil)
|
client.On("Version").Return(mockVersion, nil)
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil)
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil)
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
|
||||||
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
||||||
|
|
||||||
assert.NoError(t, engine.ConnectWithClient(client))
|
assert.NoError(t, engine.ConnectWithClient(client))
|
||||||
|
|
@ -114,7 +114,7 @@ func TestEngineState(t *testing.T) {
|
||||||
|
|
||||||
// The client will return one container at first, then a second one will appear.
|
// The client will return one container at first, then a second one will appear.
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{{Id: "one"}}, nil).Once()
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{{Id: "one"}}, nil).Once()
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
|
||||||
client.On("InspectContainer", "one").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: 100}}, nil).Once()
|
client.On("InspectContainer", "one").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: 100}}, nil).Once()
|
||||||
client.On("ListContainers", true, false, fmt.Sprintf("{%q:[%q]}", "id", "two")).Return([]dockerclient.Container{{Id: "two"}}, nil).Once()
|
client.On("ListContainers", true, false, fmt.Sprintf("{%q:[%q]}", "id", "two")).Return([]dockerclient.Container{{Id: "two"}}, nil).Once()
|
||||||
client.On("InspectContainer", "two").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: 100}}, nil).Once()
|
client.On("InspectContainer", "two").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: 100}}, nil).Once()
|
||||||
|
|
@ -159,7 +159,7 @@ func TestCreateContainer(t *testing.T) {
|
||||||
client.On("Version").Return(mockVersion, nil)
|
client.On("Version").Return(mockVersion, nil)
|
||||||
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
|
||||||
assert.NoError(t, engine.ConnectWithClient(client))
|
assert.NoError(t, engine.ConnectWithClient(client))
|
||||||
assert.True(t, engine.isConnected())
|
assert.True(t, engine.isConnected())
|
||||||
|
|
||||||
|
|
@ -172,7 +172,7 @@ func TestCreateContainer(t *testing.T) {
|
||||||
id := "id1"
|
id := "id1"
|
||||||
client.On("CreateContainer", &mockConfig, name).Return(id, nil).Once()
|
client.On("CreateContainer", &mockConfig, name).Return(id, nil).Once()
|
||||||
client.On("ListContainers", true, false, fmt.Sprintf(`{"id":[%q]}`, id)).Return([]dockerclient.Container{{Id: id}}, nil).Once()
|
client.On("ListContainers", true, false, fmt.Sprintf(`{"id":[%q]}`, id)).Return([]dockerclient.Container{{Id: id}}, nil).Once()
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
|
||||||
client.On("InspectContainer", id).Return(&dockerclient.ContainerInfo{Config: &config.ContainerConfig}, nil).Once()
|
client.On("InspectContainer", id).Return(&dockerclient.ContainerInfo{Config: &config.ContainerConfig}, nil).Once()
|
||||||
container, err := engine.Create(config, name, false)
|
container, err := engine.Create(config, name, false)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
|
@ -195,7 +195,7 @@ func TestCreateContainer(t *testing.T) {
|
||||||
client.On("CreateContainer", &mockConfig, name).Return("", dockerclient.ErrNotFound).Once()
|
client.On("CreateContainer", &mockConfig, name).Return("", dockerclient.ErrNotFound).Once()
|
||||||
client.On("CreateContainer", &mockConfig, name).Return(id, nil).Once()
|
client.On("CreateContainer", &mockConfig, name).Return(id, nil).Once()
|
||||||
client.On("ListContainers", true, false, fmt.Sprintf(`{"id":[%q]}`, id)).Return([]dockerclient.Container{{Id: id}}, nil).Once()
|
client.On("ListContainers", true, false, fmt.Sprintf(`{"id":[%q]}`, id)).Return([]dockerclient.Container{{Id: id}}, nil).Once()
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
|
||||||
client.On("InspectContainer", id).Return(&dockerclient.ContainerInfo{Config: &config.ContainerConfig}, nil).Once()
|
client.On("InspectContainer", id).Return(&dockerclient.ContainerInfo{Config: &config.ContainerConfig}, nil).Once()
|
||||||
container, err = engine.Create(config, name, true)
|
container, err = engine.Create(config, name, true)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
|
|
@ -241,7 +241,7 @@ func TestUsedCpus(t *testing.T) {
|
||||||
client.On("Info").Return(mockInfo, nil)
|
client.On("Info").Return(mockInfo, nil)
|
||||||
client.On("Version").Return(mockVersion, nil)
|
client.On("Version").Return(mockVersion, nil)
|
||||||
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil).Once()
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil).Once()
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{{Id: "test"}}, nil).Once()
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{{Id: "test"}}, nil).Once()
|
||||||
client.On("InspectContainer", "test").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: cpuShares}}, nil).Once()
|
client.On("InspectContainer", "test").Return(&dockerclient.ContainerInfo{Config: &dockerclient.ContainerConfig{CpuShares: cpuShares}}, nil).Once()
|
||||||
engine.ConnectWithClient(client)
|
engine.ConnectWithClient(client)
|
||||||
|
|
@ -268,7 +268,7 @@ func TestContainerRemovedDuringRefresh(t *testing.T) {
|
||||||
|
|
||||||
client.On("Info").Return(mockInfo, nil)
|
client.On("Info").Return(mockInfo, nil)
|
||||||
client.On("Version").Return(mockVersion, nil)
|
client.On("Version").Return(mockVersion, nil)
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
|
||||||
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{container1, container2}, nil)
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{container1, container2}, nil)
|
||||||
client.On("InspectContainer", "c1").Return(info1, errors.New("Not found"))
|
client.On("InspectContainer", "c1").Return(info1, errors.New("Not found"))
|
||||||
|
|
|
||||||
|
|
@ -190,13 +190,13 @@ func (c *Cluster) RemoveContainer(container *cluster.Container, force bool) erro
|
||||||
}
|
}
|
||||||
|
|
||||||
// Images returns all the images in the cluster.
|
// Images returns all the images in the cluster.
|
||||||
func (c *Cluster) Images() []*cluster.Image {
|
func (c *Cluster) Images(all bool) []*cluster.Image {
|
||||||
c.RLock()
|
c.RLock()
|
||||||
defer c.RUnlock()
|
defer c.RUnlock()
|
||||||
|
|
||||||
out := []*cluster.Image{}
|
out := []*cluster.Image{}
|
||||||
for _, s := range c.slaves {
|
for _, s := range c.slaves {
|
||||||
out = append(out, s.engine.Images()...)
|
out = append(out, s.engine.Images(all)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
|
||||||
|
|
@ -259,13 +259,13 @@ func (c *Cluster) monitorDiscovery(ch <-chan discovery.Entries, errCh <-chan err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Images returns all the images in the cluster.
|
// Images returns all the images in the cluster.
|
||||||
func (c *Cluster) Images() []*cluster.Image {
|
func (c *Cluster) Images(all bool) []*cluster.Image {
|
||||||
c.RLock()
|
c.RLock()
|
||||||
defer c.RUnlock()
|
defer c.RUnlock()
|
||||||
|
|
||||||
out := []*cluster.Image{}
|
out := []*cluster.Image{}
|
||||||
for _, e := range c.engines {
|
for _, e := range c.engines {
|
||||||
out = append(out, e.Images()...)
|
out = append(out, e.Images(all)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
@ -298,7 +298,7 @@ func (c *Cluster) RemoveImages(name string) ([]*dockerclient.ImageDelete, error)
|
||||||
errs := []string{}
|
errs := []string{}
|
||||||
var err error
|
var err error
|
||||||
for _, e := range c.engines {
|
for _, e := range c.engines {
|
||||||
for _, image := range e.Images() {
|
for _, image := range e.Images(true) {
|
||||||
if image.Match(name, true) {
|
if image.Match(name, true) {
|
||||||
content, err := image.Engine.RemoveImage(image, name)
|
content, err := image.Engine.RemoveImage(image, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,7 @@ func TestImportImage(t *testing.T) {
|
||||||
client.On("Version").Return(mockVersion, nil)
|
client.On("Version").Return(mockVersion, nil)
|
||||||
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
|
||||||
|
|
||||||
// connect client
|
// connect client
|
||||||
engine.ConnectWithClient(client)
|
engine.ConnectWithClient(client)
|
||||||
|
|
@ -177,7 +177,7 @@ func TestLoadImage(t *testing.T) {
|
||||||
client.On("Version").Return(mockVersion, nil)
|
client.On("Version").Return(mockVersion, nil)
|
||||||
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
client.On("StartMonitorEvents", mock.Anything, mock.Anything, mock.Anything).Return()
|
||||||
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
|
client.On("ListContainers", true, false, "").Return([]dockerclient.Container{}, nil).Once()
|
||||||
client.On("ListImages", false).Return([]*dockerclient.Image{}, nil)
|
client.On("ListImages", mock.Anything).Return([]*dockerclient.Image{}, nil)
|
||||||
|
|
||||||
// connect client
|
// connect client
|
||||||
engine.ConnectWithClient(client)
|
engine.ConnectWithClient(client)
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ func NewNode(e *cluster.Engine) *Node {
|
||||||
Name: e.Name,
|
Name: e.Name,
|
||||||
Labels: e.Labels,
|
Labels: e.Labels,
|
||||||
Containers: e.Containers(),
|
Containers: e.Containers(),
|
||||||
Images: e.Images(),
|
Images: e.Images(true),
|
||||||
UsedMemory: e.UsedMemory(),
|
UsedMemory: e.UsedMemory(),
|
||||||
UsedCpus: e.UsedCpus(),
|
UsedCpus: e.UsedCpus(),
|
||||||
TotalMemory: e.TotalMemory(),
|
TotalMemory: e.TotalMemory(),
|
||||||
|
|
|
||||||
|
|
@ -38,4 +38,8 @@ function teardown() {
|
||||||
[ "$status" -eq 0 ]
|
[ "$status" -eq 0 ]
|
||||||
[ "${#lines[@]}" -eq 2 ]
|
[ "${#lines[@]}" -eq 2 ]
|
||||||
[[ "${lines[1]}" == *"busybox"* ]]
|
[[ "${lines[1]}" == *"busybox"* ]]
|
||||||
|
|
||||||
|
# Try images -a
|
||||||
|
run docker_swarm images -a
|
||||||
|
[ "${#lines[@]}" -ge 5 ]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue