moncho/dry

dry - A Docker manager for the terminal @

3,275

stars

1,057

commits

Go

primary language

Sep 4, 2026

updated

moncho.github.io/dry/
docker
docker-cli
docker-engine
docker-swarm
golang

README

dry

MIT License Build Status Release Go Report Card GoDoc Github All Releases Release dry

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.

asciicast

dry keybinds

Global

KeybindingDescription
%filter list
F1sort list
F5refresh list
F7toggle showing Docker daemon information
F8show docker disk usage
F9show last 10 docker events
F10show docker info
1show container list
2show image list
3show network list
4show volumes list
5show node list (on Swarm mode)
6show service list (on Swarm mode)
7show stacks list (on Swarm mode)
8show compose projects list
ArrowUp or kmove the cursor one line up
ArrowDown or jmove the cursor one line down
gmove the cursor to the top
Gmove the cursor to the bottom
:open command palette
Spaceopen Quick Peek for the current selection
Ctrl+0cycle color theme (dark/light)
qquit dry

Workspace mode (--workspace)

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.

  • Tab and Shift+Tab switch focus between Navigator, Context, and Activity in the full workspace layout.
  • When Context is focused, you can scroll it with the usual navigation keys.
  • p / P pins or unpins the current preview.
  • : opens the command palette with global and context-aware actions.
  • Space opens Quick Peek, a temporary side panel with recent logs or inspect/details for the current selection.
  • f toggles follow mode in the activity pane.
  • Existing primary actions stay on their original keys. For example, Enter still opens the container command menu and still inspects resources in views where Enter already 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 Tab switch between navigator and activity.

Container commands

KeybindingDescription
Entershow container command menu (includes Attach for running containers)
F2toggle on/off showing stopped containers
iinspect
lcontainer logs
eremove
sstats
xexec a command in the selected container (default /bin/sh)
Ctrl+eremove all stopped containers
Ctrl+kkill
Ctrl+rstart/restart
Ctrl+tstop

Image commands

KeybindingDescription
ihistory
Ctrl+dremove dangling images
Ctrl+eremove image
Ctrl+fremove image (force)
Ctrl+uremove unused images
Enterinspect

Network commands

KeybindingDescription
Ctrl+eremove network
Enterinspect

Volume commands

KeybindingDescription
Ctrl+aremove all volumes
Ctrl+eremove volume
Ctrl+fremove volume (force)
Ctrl+uremove unused volumes
Enterinspect

Service commands

KeybindingDescription
iinspect service
lservice logs
Ctrl+rremove service
Ctrl+sscale service
Ctrl+uupdate service
Entershow service tasks

Compose Projects commands

KeybindingDescription
Entershow project services
ubring the selected project (or service) up
dtake the selected project down
cshow the project's rendered compose configuration
lproject logs
Ctrl+tstop project containers
Ctrl+rrestart project containers
Ctrl+eremove project containers

Compose Services commands

KeybindingDescription
Enterinspect service
Escback to projects
ubring the selected service up
cshow the project's rendered compose configuration
lservice logs
Ctrl+sstart service containers
Ctrl+tstop service containers
Ctrl+rrestart service containers
Ctrl+eremove service containers

Moving around buffers

KeybindingDescription
ArrowUp or kmove the cursor one line up
ArrowDown or jmove the cursor one line down
gmove the cursor to the beginning of the buffer
Gmove the cursor to the end of the buffer
nafter search, move forwards to the next search hit
Nafter search, move backwards to the previous search hit
ssearch
pg upmove the cursor "screen size" lines up
pg downmove the cursor "screen size" lines down

Installation

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/dry

Binaries

If you dont like to curl | sh, binaries are provided.

Mac OS X / Homebrew

If you're on OS X and want to use homebrew:

brew tap moncho/dry
brew install dry

Docker

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST=$DOCKER_HOST moncho/dry

Arch Linux

yay -S dry-bin

Usage

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.

Connecting over SSH

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.

Docker Compose

Compose projects show up in their own view (key 8); pressing Enter on a project opens its services in the Compose Services view.

KeybindingDescription
ubring the selected project or service up
dtake the selected project down (behind a confirmation prompt)
cshow 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:

LabelMeaning
okthe running containers match the compose file
driftthe compose file changed since the containers were created — the next u recreates them
nonethe 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.

Docker Swarm

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.

Contributing

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.

Credits

Built on top of:

Alternatives

See Awesome Docker list for similar tools to work with Docker.

Contributors

moncho

1,012 commits

dependabot[bot]

12 commits

muesli

5 commits

itwars

3 commits

moncho/dry

dry - A Docker manager for the terminal @

3,275

stars

1,057

commits

Go

primary language

Sep 4, 2026

updated

moncho.github.io/dry/
docker
docker-cli
docker-engine
docker-swarm
golang

README

dry

MIT License Build Status Release Go Report Card GoDoc Github All Releases Release dry

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.

asciicast

dry keybinds

Global

KeybindingDescription
%filter list
F1sort list
F5refresh list
F7toggle showing Docker daemon information
F8show docker disk usage
F9show last 10 docker events
F10show docker info
1show container list
2show image list
3show network list
4show volumes list
5show node list (on Swarm mode)
6show service list (on Swarm mode)
7show stacks list (on Swarm mode)
8show compose projects list
ArrowUp or kmove the cursor one line up
ArrowDown or jmove the cursor one line down
gmove the cursor to the top
Gmove the cursor to the bottom
:open command palette
Spaceopen Quick Peek for the current selection
Ctrl+0cycle color theme (dark/light)
qquit dry

Workspace mode (--workspace)

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.

  • Tab and Shift+Tab switch focus between Navigator, Context, and Activity in the full workspace layout.
  • When Context is focused, you can scroll it with the usual navigation keys.
  • p / P pins or unpins the current preview.
  • : opens the command palette with global and context-aware actions.
  • Space opens Quick Peek, a temporary side panel with recent logs or inspect/details for the current selection.
  • f toggles follow mode in the activity pane.
  • Existing primary actions stay on their original keys. For example, Enter still opens the container command menu and still inspects resources in views where Enter already 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 Tab switch between navigator and activity.

Container commands

KeybindingDescription
Entershow container command menu (includes Attach for running containers)
F2toggle on/off showing stopped containers
iinspect
lcontainer logs
eremove
sstats
xexec a command in the selected container (default /bin/sh)
Ctrl+eremove all stopped containers
Ctrl+kkill
Ctrl+rstart/restart
Ctrl+tstop

Image commands

KeybindingDescription
ihistory
Ctrl+dremove dangling images
Ctrl+eremove image
Ctrl+fremove image (force)
Ctrl+uremove unused images
Enterinspect

Network commands

KeybindingDescription
Ctrl+eremove network
Enterinspect

Volume commands

KeybindingDescription
Ctrl+aremove all volumes
Ctrl+eremove volume
Ctrl+fremove volume (force)
Ctrl+uremove unused volumes
Enterinspect

Service commands

KeybindingDescription
iinspect service
lservice logs
Ctrl+rremove service
Ctrl+sscale service
Ctrl+uupdate service
Entershow service tasks

Compose Projects commands

KeybindingDescription
Entershow project services
ubring the selected project (or service) up
dtake the selected project down
cshow the project's rendered compose configuration
lproject logs
Ctrl+tstop project containers
Ctrl+rrestart project containers
Ctrl+eremove project containers

Compose Services commands

KeybindingDescription
Enterinspect service
Escback to projects
ubring the selected service up
cshow the project's rendered compose configuration
lservice logs
Ctrl+sstart service containers
Ctrl+tstop service containers
Ctrl+rrestart service containers
Ctrl+eremove service containers

Moving around buffers

KeybindingDescription
ArrowUp or kmove the cursor one line up
ArrowDown or jmove the cursor one line down
gmove the cursor to the beginning of the buffer
Gmove the cursor to the end of the buffer
nafter search, move forwards to the next search hit
Nafter search, move backwards to the previous search hit
ssearch
pg upmove the cursor "screen size" lines up
pg downmove the cursor "screen size" lines down

Installation

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/dry

Binaries

If you dont like to curl | sh, binaries are provided.

Mac OS X / Homebrew

If you're on OS X and want to use homebrew:

brew tap moncho/dry
brew install dry

Docker

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock -e DOCKER_HOST=$DOCKER_HOST moncho/dry

Arch Linux

yay -S dry-bin

Usage

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.

Connecting over SSH

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.

Docker Compose

Compose projects show up in their own view (key 8); pressing Enter on a project opens its services in the Compose Services view.

KeybindingDescription
ubring the selected project or service up
dtake the selected project down (behind a confirmation prompt)
cshow 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:

LabelMeaning
okthe running containers match the compose file
driftthe compose file changed since the containers were created — the next u recreates them
nonethe 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.

Docker Swarm

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.

Contributing

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.

Credits

Built on top of:

Alternatives

See Awesome Docker list for similar tools to work with Docker.

Contributors

moncho

1,012 commits

dependabot[bot]

12 commits

muesli

5 commits

itwars

3 commits

Languages

Go

98.7%

Shell

1.0%