mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	Fix regression when filtering container names using a leading slash
Commit 5c8da2e967 updated the filtering behavior
to match container-names without having to specify the leading slash.
This change caused a regression in situations where a regex was provided as
filter, using an explicit leading slash (`--filter name=^/mycontainername`).
This fix changes the filters to match containers both with, and without the
leading slash, effectively making the leading slash optional when filtering.
With this fix, filters with and without a leading slash produce the same result:
    $ docker ps --filter name=^a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    21afd6362b0c        busybox             "sh"                2 minutes ago       Up 2 minutes                            a2
    56e53770e316        busybox             "sh"                2 minutes ago       Up 2 minutes                            a1
    $ docker ps --filter name=^/a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    21afd6362b0c        busybox             "sh"                2 minutes ago       Up 2 minutes                            a2
    56e53770e316        busybox             "sh"                3 minutes ago       Up 3 minutes                            a1
    $ docker ps --filter name=^b
    CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
    b69003b6a6fe        busybox             "sh"                About a minute ago   Up About a minute                       b1
    $ docker ps --filter name=^/b
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    b69003b6a6fe        busybox             "sh"                56 seconds ago      Up 54 seconds                           b1
    $ docker ps --filter name=/a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    21afd6362b0c        busybox             "sh"                3 minutes ago       Up 3 minutes                            a2
    56e53770e316        busybox             "sh"                4 minutes ago       Up 4 minutes                            a1
    $ docker ps --filter name=a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    21afd6362b0c        busybox             "sh"                3 minutes ago       Up 3 minutes                            a2
    56e53770e316        busybox             "sh"                4 minutes ago       Up 4 minutes                            a1
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
			
			
This commit is contained in:
		
							parent
							
								
									a005332346
								
							
						
					
					
						commit
						6f9b5ba810
					
				
					 2 changed files with 27 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -146,7 +146,8 @@ func (daemon *Daemon) filterByNameIDMatches(view container.View, ctx *listContex
 | 
			
		|||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			for _, eachName := range idNames {
 | 
			
		||||
				if ctx.filters.Match("name", strings.TrimPrefix(eachName, "/")) {
 | 
			
		||||
				// match both on container name with, and without slash-prefix
 | 
			
		||||
				if ctx.filters.Match("name", eachName) || ctx.filters.Match("name", strings.TrimPrefix(eachName, "/")) {
 | 
			
		||||
					matches[id] = true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -429,7 +430,7 @@ func includeContainerInList(container *container.Snapshot, ctx *listContext) ite
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Do not include container if the name doesn't match
 | 
			
		||||
	if !ctx.filters.Match("name", strings.TrimPrefix(container.Name, "/")) {
 | 
			
		||||
	if !ctx.filters.Match("name", container.Name) && !ctx.filters.Match("name", strings.TrimPrefix(container.Name, "/")) {
 | 
			
		||||
		return excludeContainer
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,6 @@ import (
 | 
			
		|||
	"io/ioutil"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/docker/docker/api/types"
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +34,7 @@ func TestMain(m *testing.M) {
 | 
			
		|||
// work against it. It takes in a pointer to Daemon so that
 | 
			
		||||
// minor operations are not repeated by the caller
 | 
			
		||||
func setupContainerWithName(t *testing.T, name string, daemon *Daemon) *container.Container {
 | 
			
		||||
	t.Helper()
 | 
			
		||||
	var (
 | 
			
		||||
		id              = uuid.New()
 | 
			
		||||
		computedImageID = digest.FromString(id)
 | 
			
		||||
| 
						 | 
				
			
			@ -46,6 +46,9 @@ func setupContainerWithName(t *testing.T, name string, daemon *Daemon) *containe
 | 
			
		|||
 | 
			
		||||
	c := container.NewBaseContainer(id, cRoot)
 | 
			
		||||
	// these are for passing includeContainerInList
 | 
			
		||||
	if name[0] != '/' {
 | 
			
		||||
		name = "/" + name
 | 
			
		||||
	}
 | 
			
		||||
	c.Name = name
 | 
			
		||||
	c.Running = true
 | 
			
		||||
	c.HostConfig = &containertypes.HostConfig{}
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +71,7 @@ func setupContainerWithName(t *testing.T, name string, daemon *Daemon) *containe
 | 
			
		|||
func containerListContainsName(containers []*types.Container, name string) bool {
 | 
			
		||||
	for _, container := range containers {
 | 
			
		||||
		for _, containerName := range container.Names {
 | 
			
		||||
			if strings.TrimPrefix(containerName, "/") == name {
 | 
			
		||||
			if containerName == name {
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -110,16 +113,33 @@ func TestNameFilter(t *testing.T) {
 | 
			
		|||
	containerList, err := d.Containers(&types.ContainerListOptions{
 | 
			
		||||
		Filters: filters.NewArgs(filters.Arg("name", "^a")),
 | 
			
		||||
	})
 | 
			
		||||
	assert.Assert(t, err == nil)
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
	assert.Assert(t, is.Len(containerList, 2))
 | 
			
		||||
	assert.Assert(t, containerListContainsName(containerList, one.Name))
 | 
			
		||||
	assert.Assert(t, containerListContainsName(containerList, two.Name))
 | 
			
		||||
 | 
			
		||||
	// Same as above but with slash prefix should produce the same result
 | 
			
		||||
	containerListWithPrefix, err := d.Containers(&types.ContainerListOptions{
 | 
			
		||||
		Filters: filters.NewArgs(filters.Arg("name", "^/a")),
 | 
			
		||||
	})
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
	assert.Assert(t, is.Len(containerListWithPrefix, 2))
 | 
			
		||||
	assert.Assert(t, containerListContainsName(containerListWithPrefix, one.Name))
 | 
			
		||||
	assert.Assert(t, containerListContainsName(containerListWithPrefix, two.Name))
 | 
			
		||||
 | 
			
		||||
	// Same as above but make sure it works for exact names
 | 
			
		||||
	containerList, err = d.Containers(&types.ContainerListOptions{
 | 
			
		||||
		Filters: filters.NewArgs(filters.Arg("name", "b1")),
 | 
			
		||||
	})
 | 
			
		||||
	assert.Assert(t, err == nil)
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
	assert.Assert(t, is.Len(containerList, 1))
 | 
			
		||||
	assert.Assert(t, containerListContainsName(containerList, three.Name))
 | 
			
		||||
 | 
			
		||||
	// Same as above but with slash prefix should produce the same result
 | 
			
		||||
	containerListWithPrefix, err = d.Containers(&types.ContainerListOptions{
 | 
			
		||||
		Filters: filters.NewArgs(filters.Arg("name", "/b1")),
 | 
			
		||||
	})
 | 
			
		||||
	assert.NilError(t, err)
 | 
			
		||||
	assert.Assert(t, is.Len(containerListWithPrefix, 1))
 | 
			
		||||
	assert.Assert(t, containerListContainsName(containerListWithPrefix, three.Name))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue