How do I get into a Docker container's shell?
Categories:
Accessing Your Docker Container's Shell: A Comprehensive Guide

Learn various methods to get a shell inside your running Docker containers for debugging, inspection, and interactive tasks.
Docker containers provide isolated environments for your applications. While they are designed to run processes autonomously, there are many scenarios where you need to interact directly with a running container's shell. This could be for debugging, inspecting files, running one-off commands, or performing administrative tasks. This article will guide you through the most common and effective ways to access a Docker container's shell, explaining the nuances of each method.
Understanding Container Shell Access
When you run a Docker container, it executes a primary process (e.g., a web server, a database). Accessing the container's shell means starting a new process, typically /bin/bash
or /bin/sh
, within the container's isolated environment. This new process allows you to execute commands as if you were logged into a virtual machine or a remote server. The choice of shell (bash
vs. sh
) often depends on what's available in the container's base image.
flowchart TD A[User] --> B{Need Shell Access?} B -->|Yes| C[Identify Container ID/Name] C --> D{Container Running?} D -->|No| E[Start Container] D -->|Yes| F[Choose Access Method] F --> G["docker exec -it <container> <shell>"] F --> H["docker attach <container>"] F --> I["docker run -it --rm --entrypoint <shell> <image>"] G --> J[Interactive Shell] H --> J I --> J J --> K[Perform Tasks] K --> L[Exit Shell]
Workflow for gaining shell access to a Docker container.
Method 1: Using docker exec
(Recommended)
The docker exec
command is the most common and recommended way to get an interactive shell inside a running Docker container. It executes a new command in a running container. The -i
(interactive) and -t
(pseudo-TTY) flags are crucial for creating an interactive shell session. Without them, the command would execute and immediately exit without providing a prompt.
docker exec -it <container_id_or_name> /bin/bash
# If bash is not available, try sh:
docker exec -it <container_id_or_name> /bin/sh
Executing an interactive bash or sh shell inside a running container.
<container_id_or_name>
, use docker ps
. You can use either the full ID, a partial ID (as long as it's unique), or the container's assigned name.Method 2: Using docker attach
The docker attach
command allows you to attach your local standard input, output, and error streams to a running container's main process. This means you'll be interacting with the container's primary process, not necessarily a new shell. If the container's entrypoint is a shell, attach
might give you a shell. However, if the entrypoint is an application (like a web server), attach
will connect you to that application's output, and input might not be what you expect.
docker attach <container_id_or_name>
Attaching to a running container's main process.
docker attach
. If you exit the attached session (e.g., by typing exit
or Ctrl+D
), you might stop the container's main process, causing the container to stop entirely. Use Ctrl+P
, Ctrl+Q
to detach without stopping the container.Method 3: Running a New Container with an Entrypoint Override
This method is less common for accessing an existing container's shell but is useful if you want to quickly spin up a new container based on an image and immediately drop into its shell. You use docker run
with the --entrypoint
flag to override the default entrypoint and specify /bin/bash
or /bin/sh
instead.
docker run -it --rm --entrypoint /bin/bash <image_name>
# Or with sh:
docker run -it --rm --entrypoint /bin/sh <image_name>
Running a new container and immediately entering its shell.
--rm
flag automatically removes the container once you exit the shell, which is convenient for temporary inspection tasks.Troubleshooting: 'executable file not found in $PATH'
Sometimes, when trying to execute /bin/bash
or /bin/sh
, you might encounter an error like OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": executable file not found in $PATH
. This usually means the specified shell is not installed in the container's image. Many minimal Docker images (like alpine
) only include /bin/sh
and not /bin/bash
to keep the image size small.
1. Check for sh
If /bin/bash
fails, try /bin/sh
instead: docker exec -it <container_id_or_name> /bin/sh
.
2. Inspect the Dockerfile
If you have access to the Dockerfile, check what base image is used and if bash
or sh
is explicitly installed. For example, Debian/Ubuntu-based images usually have bash
, while Alpine-based images typically only have sh
.
3. Install the desired shell (if necessary)
If you absolutely need bash
and it's not present, you might need to create a custom Dockerfile based on the original, add bash
(e.g., RUN apt-get update && apt-get install -y bash
for Debian/Ubuntu or RUN apk add bash
for Alpine), and then rebuild your image.