Docker containers are designed to run isolated workloads, often with a specific command at startup. However, there are many cases where you might want to run an additional command inside an already existing (and possibly running or stopped) container. This is a common need for debugging, maintenance, data inspection, or manual intervention.
In this blog post, we’ll explore several ways to run commands on an existing Docker container—both interactively and in the background.
🧠 Key Concepts
Before we begin, understand that:
- A container must exist (running or stopped) to run commands inside it.
- The command you run executes in the context of the container’s filesystem and environment.
- You can run commands interactively (e.g., with a shell) or one-time (e.g., checking a file or running a script).
✅ Method 1: Use docker exec
(For Running Containers)
If the container is already running, the easiest way to run a command is using docker exec
.
🔧 Syntax:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
🔹 Example: List files in /app
inside the container
docker exec my-container ls /app
🔹 Example: Open an interactive shell (bash)
docker exec -it my-container bash
Or if bash
is not available:
docker exec -it my-container sh
📝 Tip:
-i
= interactive-t
= allocate a pseudo-TTY (for terminal interaction)
✅ Method 2: Use docker attach
(For Interacting with the Main Process)
If you want to interact directly with the container’s main process (e.g., a running server or REPL), use docker attach
.
Example:
docker attach my-container
⚠️ Warning:
- You’re connecting to the main process running in the container.
- Exiting may stop the container unless you detach properly (usually with
Ctrl + P, Ctrl + Q
).
✅ Method 3: Use docker exec
on a Detached Background Command
You can also run background tasks on a running container without interrupting its main process:
docker exec -d my-container some-long-running-task
The -d
flag runs the command in detached mode.
✅ Method 4: Use docker start
+ docker exec
(If Container Is Stopped)
If the container is stopped, you need to start it first before running commands.
docker start my-container
docker exec my-container some-command
Or, for one-time execution:
docker start -ai my-container
The -a
flag attaches STDOUT/STDERR, and -i
keeps STDIN open.
✅ Method 5: Use docker cp
+ docker exec
to Run Custom Scripts
If you want to run a script inside a container:
- Copy the script to the container:
docker cp myscript.sh my-container:/tmp/myscript.sh
- Execute it:
docker exec my-container bash /tmp/myscript.sh
Summary of Options
Action | Command |
---|---|
Run a command on a running container | docker exec my-container command |
Open an interactive shell | docker exec -it my-container bash |
Interact with the main process | docker attach my-container |
Run command in background | docker exec -d my-container command |
Run command on stopped container | docker start my-container && docker exec my-container command |
Copy and run a script | docker cp + docker exec |
Conclusion
Docker makes it easy to interact with containers even after they’re running. Whether you need to debug, inspect, or extend the behavior of your application, tools like docker exec
, docker attach
, and docker cp
give you full control over your container’s runtime environment.
By learning how to safely and effectively run commands in containers, you can gain deeper insight into your applications, resolve issues faster, and manage your environments with confidence.