Dictionaries/docker.ps1

# Dynamic sources
$containers = [DynamicSource]@{
    Name = "Containers";
    Description = "List of running containers";
    CommandExpression = { 
        docker ps --format "{{.Names}}" 
    };
    Cache = [Cache]@{
        ByCurrentWorkingDirectory = $true;
        ByTime = New-TimeSpan -Seconds 10 ;
        ByCommand = @("kill", "run", "stop", "start","rm","pause")
    }
}

$allContainers = [DynamicSource]@{
    Name = "All Containers";
    Description = "List of all containers (running + stopped)";
    CommandExpression = { 
        docker ps -a --format "{{.Names}}" 
    };
    Cache = [Cache]@{ 
        ByCurrentWorkingDirectory = $true;
        ByTime = New-TimeSpan -Seconds 10 ;
        ByCommand = @("kill", "run", "stop", "start","rm","pause")
    }
}

$images = [DynamicSource]@{
    Name = "Images";
    Description = "List of Docker images";
    CommandExpression = { 
        docker images --format "{{.Repository}}:{{.Tag}}" 
    };
    Cache = [Cache]@{ 
        ByTime = New-TimeSpan -Seconds 30 
    }
}

$volumes = [DynamicSource]@{
    Name = "Volumes";
    Description = "List of Docker volumes";
    CommandExpression = { 
        docker volume ls --format "{{.Name}}" 
    };
    Cache = [Cache]@{ 
        ByTime = New-TimeSpan -Seconds 30 
    }
}

$dockerContexts = [DynamicSource]@{
    Name = "Docker Contexts";
    Description = "List of Docker contexts";
    CommandExpression = { 
        docker context ls --format "{{.Name}}" 
    };
    Cache = [Cache]@{ 
        ByTime = New-TimeSpan -Seconds 10 
    }
}

# Docker PowerTypeDictionary
[PowerTypeDictionary]@{
    Keys        = @("docker");
    Name        = "Docker";
    Description = "Docker CLI management";
    Platforms   = [Platforms]::All;
    State       = [DictionaryState]::Experimental -bor [DictionaryState]::Incomplete;
    Source      = "Hand crafted";
    Url         = "https://docs.docker.com/engine/reference/commandline/cli/";
    Parameters  = @(
        # Containers
        [CommandParameter]@{
            Keys = @("ps");
            Name = "ps";
            Description = "List containers";
            Parameters = @(
                [FlagParameter]@{ 
                    Keys=@("-a","--all"); 
                    Name="all"; 
                    Description="Show all containers" 
                }
            )
        },
        [CommandParameter]@{
            Keys = @("run");
            Name = "run";
            Description = "Run a new container";
            Parameters = @(
                [ValueParameter]@{ 
                    Name="image"; 
                    Description="Image to run"; 
                    Source=$images 
                }
            )
        },
        [CommandParameter]@{
            Keys = @("exec");
            Name = "exec";
            Description = "Run command in a running container";
            Parameters = @(
                [ValueParameter]@{ 
                    Name="container"; 
                    Description="Container to exec into"; 
                    Source=$containers 
                }
            )
        },
        [CommandParameter]@{
            Keys = @("stop");
            Name = "stop";
            Description = "Stop container(s)";
            Parameters = @(
                [ValueParameter]@{ 
                    Name="container"; 
                    Description="Container to stop"; 
                    Source=$containers 
                }
            )
        },
        [CommandParameter]@{
            Keys = @("rm");
            Name = "rm";
            Description = "Remove container(s)";
            Parameters = @(
                [ValueParameter]@{ 
                    Name="container"; 
                    Description="Container to remove"; 
                    Source=$allContainers 
                }
            )
        },
        # Images
        [CommandParameter]@{ 
            Keys=@("images"); 
            Name="images"; 
            Description="List images" 
        },
        [CommandParameter]@{ 
            Keys=@("rmi");
            Name="rmi"; 
            Description="Remove image"; 
            Parameters=@(
                [ValueParameter]@{ 
                    Name="image"; 
                    Description="Image to remove"; 
                    Source=$images 
                }
            )
        },
        [CommandParameter]@{ 
            Keys=@("tag"); 
            Name="tag"; 
            Description="Tag an image"; 
            Parameters=@(
                [ValueParameter]@{ 
                    Name="image"; 
                    Description="Image to tag"; 
                    Source=$images 
                }
            )
        },
        [CommandParameter]@{ 
            Keys=@("push"); 
            Name="push"; 
            Description="Push an image to registry"; 
            Parameters=@(
                [ValueParameter]@{ 
                    Name="image"; 
                    Description="Image to push"; 
                    Source=$images 
                }
            )
        },
        [CommandParameter]@{ 
            Keys=@("pull"); 
            Name="pull"; 
            Description="Pull an image"; 
            Parameters=@(
                [ValueParameter]@{ 
                    Name="image"; 
                    Description="Image to pull"; 
                    Source=$images 
                }
            )
        },

        # Contexts
        [CommandParameter]@{
            Keys = @("context");
            Name = "context";
            Description = "Manage Docker contexts";
            Parameters = @(
                [ValueParameter]@{ 
                    Keys=@("ls"); 
                    Name="ls"; 
                    Description="List contexts" 
                },
                [ValueParameter]@{ 
                    Keys=@("inspect"); 
                    Name="inspect"; 
                    Description="Inspect context"; 
                    Source=$dockerContexts 
                },
                [ValueParameter]@{ 
                    Keys=@("use"); 
                    Name="use"; 
                    Description="Switch context"; 
                    Source=$dockerContexts 
                }
            )
        },

        # System
        [CommandParameter]@{
            Keys=@("system");
            Name="system";
            Description="Inspect/manage Docker system";
            Parameters=@(
                [ValueParameter]@{ 
                    Keys=@("df"); 
                    Name="df"; 
                    Description="Show disk usage" 
                },
                [ValueParameter]@{ 
                    Keys=@("prune"); 
                    Name="prune"; 
                    Description="Remove unused objects" 
                },
                [ValueParameter]@{ 
                    Keys=@("info"); 
                    Name="info"; 
                    Description="Show system info" 
                },
                [ValueParameter]@{ 
                    Keys=@("events"); 
                    Name="events"; 
                    Description="Show events log" 
                }
            )
        },

        # Volumes
        [CommandParameter]@{
            Keys=@("volume");
            Name="volume";
            Description="Manage volumes";
            Parameters=@(
                [ValueParameter]@{ 
                    Keys=@("ls"); 
                    Name="ls"; 
                    Description="List volumes"; 
                    Source=$volumes 
                },
                [ValueParameter]@{ 
                    Keys=@("rm"); 
                    Name="rm"; 
                    Description="Remove volume"; 
                    Source=$volumes 
                }
            )
        },

        # Networks, Plugins, Swarm, Logs
        [CommandParameter]@{ 
            Keys=@("network"); 
            Name="network"; 
            Description="Manage networks" 
        },
        [CommandParameter]@{ 
            Keys=@("plugin"); 
            Name="plugin"; 
            Description="Manage plugins"; 
            Parameters=@(
            [ValueParameter]@{ 
                Keys=@("install"); 
                Name="install"; 
                Description="Install plugin" }
            )
        },
        [CommandParameter]@{ 
            Keys=@("swarm"); 
            Name="swarm"; 
            Description="Manage swarm" 
        },
        [CommandParameter]@{ 
            Keys=@("logs"); 
            Name="logs"; 
            Description="Show container logs"; 
            Parameters=@(
                [ValueParameter]@{ 
                    Name="container"; 
                    Description="Container to show logs"; 
                    Source=$containers 
                }
            )
        },
        [CommandParameter]@{ 
            Keys=@("start"); 
            Name="start"; 
            Description="Start one or more stopped containers."; 
            Parameters = @(
                [ValueParameter]@{ 
                    Name="container"; 
                    Description="Container to start."; 
                    Source=$containers 
                }
            )
        },
        [CommandParameter]@{ 
            Keys=@("pause"); 
            Name="pause"; 
            Description="Pause all processes within one or more containers."; 
            Parameters = @(
                [ValueParameter]@{ 
                    Name="container"; 
                    Description="Container to pause."; 
                    Source=$containers 
                }
            )
        },
        [CommandParameter]@{ 
            Keys=@("unpause"); 
            Name="unpause"; 
            Description="Unpause all processes within one or more containers."; 
            Parameters = @(
                [ValueParameter]@{ 
                    Name="container"; 
                    Description="Container to unpause."; 
                    Source=$containers 
                }
            )
        }
    )
}