#!/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= [--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);