69 lines
1.7 KiB
Perl
Executable File
69 lines
1.7 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use warnings;
|
|
use strict;
|
|
use JSON;
|
|
use Getopt::Long;
|
|
use File::Which;
|
|
use Data::Dumper;
|
|
|
|
my $what = 'containers';
|
|
my $pretty = 0;
|
|
|
|
GetOptions(
|
|
'what=s' => \$what,
|
|
'pretty' => \$pretty
|
|
);
|
|
|
|
my $json = [];
|
|
|
|
my $docker = which('docker');
|
|
|
|
# If the docker cli is not available, terminate now
|
|
if (not defined $docker){
|
|
print $json . "\n";
|
|
exit(0);
|
|
}
|
|
|
|
my $format;
|
|
my $cmd;
|
|
if ($what =~ m/^containers?/){
|
|
$format = '{' .
|
|
'"{#DOCKER_CONTAINER_ID}":"{{ .ID }}",' .
|
|
'"{#DOCKER_CONTAINER_IMAGE}": "{{ .Image }}",' .
|
|
'"{#DOCKER_CONTAINER_NAME}":"{{ .Names }}",' .
|
|
'"{#DOCKER_CONTAINER_STATE}": "{{ .State }}"' .
|
|
'}';
|
|
$cmd = "$docker container list --all --format '$format'";
|
|
} elsif ($what =~ m/^networks?/){
|
|
$format = '{' .
|
|
'"{#DOCKER_NET_ID}":"{{ .ID }}",' .
|
|
'"{#DOCKER_NET_NAME}":"{{ .Name }}",' .
|
|
'"{#DOCKER_NET_DRIVER}":"{{ .Driver }}",' .
|
|
'"{#DOCKER_NET_SCOPE}":"{{ .Scope }}"' .
|
|
'}';
|
|
$cmd = "$docker network list --format '$format'";
|
|
} elsif ($what =~ m/^volumes?/){
|
|
$format = '{' .
|
|
'"{#DOCKER_VOL_NAME}":"{{ .Name }}",' .
|
|
'"{#DOCKER_VOL_DRIVER}":"{{ .Driver }}",' .
|
|
'"{#DOCKER_VOL_SCOPE}":"{{ .Scope }}"' .
|
|
'}';
|
|
$cmd = "$docker volume list --format '$format'";
|
|
} else {
|
|
print <<_EOF
|
|
Usage: $0 --what=<item to discover> [--pretty]
|
|
with available item being
|
|
* containers : list containers, including stopped ones
|
|
* networks : list networks
|
|
* volumes : list volumes
|
|
_EOF
|
|
}
|
|
|
|
foreach my $line (qx($cmd)){
|
|
chomp $line;
|
|
push @{$json}, from_json($line);
|
|
}
|
|
print to_json($json, { pretty => $pretty }) . "\n";
|
|
exit(0);
|