Docker provides a comprehensive API and CLI to its platform. This article is concerned with customising the output returned by Docker CLI commands.
There are a large number of Docker client CLI commands, which provide information relating to various Docker objects on a given Docker host or Swarm cluster. Generally, this output is provided in a tabular format. An example, which all Docker users will have come across, is the docker container ls
command, which provides a list of running containers:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
43195e559b42 wordpress "docker-entrypoint..." 47 seconds ago Up 46 seconds 0.0.0.0:8080->80/tcp wp
f7926468281f mariadb "docker-entrypoint..." 2 minutes ago Up 2 minutes 3306/tcp mysql
Customising Command Output Link to heading
Sometimes, all of this information is too much, and you may find yourself wanting to format the output just how you’d like it. You might want to do this to de-clutter the output, for aesthetic purposes, or for formatting output as input to scripts. This is quite straightforward to do, as a large number of CLI commands have a config option, --format
, just for this purpose. The format of the output needs to be specified using a Golang template, which translates a JSON object into the desired format. For example, if we’re only interested in the container ID, image, status, exposed ports and name, we could get this with the following (the \t
specifies a tab):
$ docker container ls --format '{{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}'
43195e559b42 wordpress Up 41 minutes 0.0.0.0:8080->80/tcp wp
f7926468281f mariadb Up 43 minutes 3306/tcp mysql
This provides us with the reduced amount of information we specified, but it looks a bit shoddy. We can add the table directive to improve the look:
$ docker container ls --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}'
CONTAINER ID IMAGE STATUS PORTS NAMES
43195e559b42 wordpress Up About an hour 0.0.0.0:8080->80/tcp wp
f7926468281f mariadb Up About an hour 3306/tcp mysql
Docker actually uses a template applied to a JSON object, to generate the default output you see when no user-defined formatting is applied. The default table format for listing all of the container objects is:
table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.RunningFor}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}
These are not the complete set of fields available in the output, however. We can find all of the fields associated with the container object, with:
$ docker container ls --format '{{json .}}' | jq '.'
{
"Command": "\"docker-entrypoint...\"",
"CreatedAt": "2017-07-24 16:23:25 +0100 BST",
"ID": "43195e559b42",
"Image": "wordpress",
"Labels": "",
"LocalVolumes": "1",
"Mounts": "c71e998f250e...",
"Names": "wp",
"Networks": "wp",
"Ports": "0.0.0.0:8080->80/tcp",
"RunningFor": "About an hour ago",
"Size": "0B",
"Status": "Up About an hour"
}
{
"Command": "\"docker-entrypoint...\"",
"CreatedAt": "2017-07-24 16:21:33 +0100 BST",
"ID": "f7926468281f",
"Image": "mariadb",
"Labels": "",
"LocalVolumes": "1",
"Mounts": "acaa1732009a...",
"Names": "mysql",
"Networks": "wp",
"Ports": "3306/tcp",
"RunningFor": "About an hour ago",
"Size": "0B",
"Status": "Up About an hour"
}
Notice that there are some keys in each of the objects, missing from the default output; Labels, LocalVolumes, Mounts and Networks, to name a few. Hence, we could customise our output further, by replacing the Status field with the Networks field:
$ docker container ls --format 'table {{.ID}}\t{{.Image}}\t{{.Networks}}\t{{.Ports}}\t{{.Names}}'
CONTAINER ID IMAGE NETWORKS PORTS NAMES
43195e559b42 wordpress bridgey,wp 0.0.0.0:8080->80/tcp wp
f7926468281f mariadb wp 3306/tcp mysql
Making a Customisation Permanent Link to heading
The --format
config option is great if you want to customise the output in a specific way for a particular use case. It would be a significant PITA, however, if you had to remember this syntax each time you issued a command, if you wanted to perpetually have customised output. You would of course, create an alias, or a script. Docker, however, allows you to make this customisation more permanent, with the use of a configuration file. When a user on a Docker host logs in to the Docker Hub for the very first time, using the docker login
command, a file called config.json
is created in a directory called .docker
in the user’s home directory. This file is used by Docker to hold JSON encoded properties, including a user’s credentials. It can also be used to hold the format template for the docker container ls
command, using the psFormat
property. The property is called psFormat
, after the old version of the command name, docker ps
. A config.json
file might look like this:
$ cat config.json
{
"auths": {},
"psFormat": "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}\t{{.Networks}}"
}
The psFormat
property is the JSON key, whilst the value is the required template for configuring the command output.
With the psFormat
property defined, every time you use the docker container ls
command, you’ll get the customised output you desire. It’s possible to override the customisation on a case by case basis, simply by using the --format
config option, which takes precedence. Take care when editing the config file; incorrect syntax could render all properties invalid.
Valid Command Customisation Properties Link to heading
Whilst the output for a large number of commands can be formatted using the --format
config option, permanent customisation via a property defined in the config.json
file, is mainly reserved for commands listing particular objects. A complete list of the commands, their relevant config property, and default template, are provided in the table below:
Command | Property | Default Template |
---|---|---|
docker container ls |
psFormat |
table {{.ID}}\t{{.Image}}\t{{.Command}}\t{{.RunningFor}}\t{{.Status}}\t{{.Ports}}\t{{.Names}} |
docker image ls |
imagesFormat |
table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedSince}}\t{{.Size}} |
docker network ls |
networksFormat |
table {{.ID}}\t{{.Name}}\t{{.Driver}}\t{{.Scope}} |
docker plugin ls |
pluginsFormat |
table {{.ID}}\t{{.Name}}\t{{.Description}}\t{{.Enabled}} |
docker volume ls |
volumesFormat |
table {{.Driver}}\t{{.Name}} |
This table omits a number of templates for Docker CLI commands that relate to ‘swarm mode’. Finally, the output of the docker stats
command can be defined in the config.json
file, too. This command provides rudimentary, real-time resource consumption for running containers, and the statsFormat
property allows for customising which metrics are displayed:
Command | Property | Default Template |
---|---|---|
docker stats |
statsFormat |
table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}} |