Dry is a terminal application for Docker and Docker Compose.
It lets you browse containers, images, networks, and volumes, and manage Compose projects — bring them up, take them down, see what has drifted from the compose file — without leaving the terminal. It can be used with both local or remote Docker daemons.
Besides showing information, it can be used to manage Docker. Most of the commands that the official Docker CLI provides, are available in dry with the same behaviour. A list of available commands and their keybindings can be found in dry's help screen or in this README.
It can also be used as a monitoring tool for Docker containers, and, when the daemon is running a Swarm cluster, to manage Nodes, Services, and Stacks — see Docker Swarm below.
Dry is installed as a single binary and does not require external libraries.
The demo below shows a dry session.
| Keybinding | Description |
|---|---|
| % | filter list |
| F1 | sort list |
| F5 | refresh list |
| F7 | toggle showing Docker daemon information |
| F8 | show docker disk usage |
| F9 | show last 10 docker events |
| F10 | show docker info |
| 1 | show container list |
| 2 | show image list |
| 3 | show network list |
| 4 | show volumes list |
| 5 | show node list (on Swarm mode) |
| 6 | show service list (on Swarm mode) |
| 7 | show stacks list (on Swarm mode) |
| 8 | show compose projects list |
| ArrowUp or k | move the cursor one line up |
| ArrowDown or j | move the cursor one line down |
| g | move the cursor to the top |
| G | move the cursor to the bottom |
| : | open command palette |
| Space | open Quick Peek for the current selection |
| Ctrl+0 | cycle color theme (dark/light) |
| q | quit dry |
dry --workspace enables the Phase 1 workspace shell. This keeps the current list view visible together with a passive context pane and a bottom activity pane.
TabandShift+Tabswitch focus betweenNavigator,Context, andActivityin the full workspace layout.- When
Contextis focused, you can scroll it with the usual navigation keys. p/Ppins or unpins the current preview.:opens the command palette with global and context-aware actions.SpaceopensQuick Peek, a temporary side panel with recent logs or inspect/details for the current selection.ftoggles follow mode in the activity pane.- Existing primary actions stay on their original keys. For example,
Enterstill opens the container command menu and still inspects resources in views whereEnteralready meant inspect/drill-down. - Embedded activity logs start from a recent tail instead of replaying the full log history.
- On narrow or short terminals, workspace mode falls back to a compact single-pane layout and lets
Tabswitch between navigator and activity.
| Keybinding | Description |
|---|---|
| Enter | show container command menu (includes Attach for running containers) |
| F2 | toggle on/off showing stopped containers |
| i | inspect |
| l | container logs |
| e | remove |
| s | stats |
| x | exec a command in the selected container (default /bin/sh) |
| Ctrl+e | remove all stopped containers |
| Ctrl+k | kill |
| Ctrl+r | start/restart |
| Ctrl+t | stop |
| Keybinding | Description |
|---|---|
| i | history |
| Ctrl+d | remove dangling images |
| Ctrl+e | remove image |
| Ctrl+f | remove image (force) |
| Ctrl+u | remove unused images |
| Enter | inspect |
| Keybinding | Description |
|---|---|
| Ctrl+e | remove network |
| Enter | inspect |
| Keybinding | Description |
|---|---|
| Ctrl+a | remove all volumes |
| Ctrl+e | remove volume |
| Ctrl+f | remove volume (force) |
| Ctrl+u | remove unused volumes |
| Enter | inspect |
| Keybinding | Description |
|---|---|
| i | inspect service |
| l | service logs |
| Ctrl+r | remove service |
| Ctrl+s | scale service |
| Ctrl+u | update service |
| Enter | show service tasks |
| Keybinding | Description |
|---|---|
| Enter | show project services |
| u | bring the selected project (or service) up |
| d | take the selected project down |
| c | show the project's rendered compose configuration |
| l | project logs |
| Ctrl+t | stop project containers |
| Ctrl+r | restart project containers |
| Ctrl+e | remove project containers |
| Keybinding | Description |
|---|---|
| Enter | inspect service |
| Esc | back to projects |
| u | bring the selected service up |
| c | show the project's rendered compose configuration |
| l | service logs |
| Ctrl+s | start service containers |
| Ctrl+t | stop service containers |
| Ctrl+r | restart service containers |
| Ctrl+e | remove service containers |
| Keybinding | Description |
|---|---|
| ArrowUp or k | move the cursor one line up |
| ArrowDown or j | move the cursor one line down |
| g | move the cursor to the beginning of the buffer |
| G | move the cursor to the end of the buffer |
| n | after search, move forwards to the next search hit |
| N | after search, move backwards to the previous search hit |
| s | search |
| pg up | move the cursor "screen size" lines up |
| pg down | move the cursor "screen size" lines down |
The easiest way to install the latest binaries for Linux and Mac is to run this in a shell:
curl -sSf https://moncho.github.io/dry/dryup.sh | sudo sh
sudo chmod 755 /usr/local/bin/dryIf you dont like to curl | sh, binaries are provided.
If you're on OS X and want to use homebrew:
brew tap moncho/dry
brew install dry
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST=$DOCKER_HOST moncho/dry
yay -S dry-bin
Open a console, type dry. It will try to connect to:
- A Docker host given as a parameter (-H).
- if none given, a Docker host defined in the $DOCKER_HOST environment variable.
- if not defined, to unix:///var/run/docker.sock.
If no connection with a Docker host succeeds, dry will exit.
dry can talk to a remote Docker daemon through SSH, the same way the docker CLI does:
DOCKER_HOST=ssh://user@host dry
Host, port, and user are resolved like the ssh command resolves them:
Hostname, Port, User, and IdentityFile directives from
~/.ssh/config are honored, the port defaults to 22, the user defaults to
the current OS user, and the remote Docker socket defaults to
/var/run/docker.sock (a different socket path can be given in the URL,
e.g. ssh://user@host:2222/run/user/1000/docker.sock).
Authentication tries, in order: the identity files configured for the host
in ~/.ssh/config (or, when none is configured, the ~/.ssh/id_* keys),
keys held by a running SSH agent (SSH_AUTH_SOCK), and a password given
in the URL. Passphrase protected key files are used through the agent.
The remote host key is verified against ~/.ssh/known_hosts and
/etc/ssh/ssh_known_hosts, and the connection fails if the host is
unknown or its key does not match. Connect once with ssh host to record
the key. Verification can be disabled with
DRY_SSH_INSECURE_SKIP_HOST_KEY_CHECK=1, which leaves the connection open
to interception and should only be used against hosts you fully control.
dry -T light launches dry with the light color theme. Available themes: dark (default), light.
dry --workspace launches the experimental Phase 1 workspace layout.
dry -p launches dry with pprof package active.
Compose projects show up in their own view (key 8); pressing Enter on a project opens its services in the Compose Services view.
| Keybinding | Description |
|---|---|
| u | bring the selected project or service up |
| d | take the selected project down (behind a confirmation prompt) |
| c | show the project's rendered compose configuration |
u and c work in both the Compose Projects and Compose Services views; d works in Compose Projects only.
The SYNC column reports whether a service's running containers match its compose file:
| Label | Meaning |
|---|---|
ok |
the running containers match the compose file |
drift |
the compose file changed since the containers were created — the next u recreates them |
none |
the compose file defines the service, but nothing is running it |
Projects are discovered two ways: from container labels — including stopped containers — and from a compose file in the directory dry was started in (that directory only; it is not a recursive search). A project known only from a file is listed with no running containers, and pressing u brings it up.
All of the above — the u/d/c keys and the SYNC column — require the docker compose CLI plugin. Without it, the Compose views still list projects discovered from container labels, and the keys respond with a status message naming the missing plugin instead of acting.
dry also works with Docker Swarm. When the connected daemon reports an active swarm, three extra views become available: Nodes (5), Services (6), and Stacks (7). Without an active swarm these views, their keybindings, and their command-palette entries are hidden.
All contributions are welcome.
- Fork the project.
- Make changes on a topic branch.
- Pull request.
Code released under the MIT license. See LICENSE for the full license text.
Built on top of:
See Awesome Docker list for similar tools to work with Docker.
