648

I created a container with -d so it's not interactive.

docker run -d shykes/pybuilder bin/bash 

I see that the container has exited:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d6c45e8cc5f0 shykes/pybuilder:latest "bin/bash" 41 minutes ago Exited (0) 2 seconds ago clever_bardeen 

Now I would like to run occasional commands on the machine and exit. Just to get the response.

I tried to start the machine. I tried attaching. I thought I could call run with a container, but that does not seem to be allowed. Using start just seems to run and then exist quickly.

I'd like to get back into interactive mode after exiting.

I tried:

docker attach d6c45e8cc5f0 

But I get:

2014/10/01 22:33:34 You cannot attach to a stopped container, start it first 

But if I start it, it exits anyway. Catch 22. I can't win.

3
  • how did you know that the docker container had exited? what command did you run? Commented Nov 22, 2017 at 8:54
  • docker container ls -a Commented Nov 7, 2018 at 5:22
  • If you just need the file system: How to start a stopped Docker container with a different command? (Note that environment variables and other things in memory are already lost when the container stopped.) Commented Feb 26, 2019 at 4:53

21 Answers 21

655

In October 2014 the Docker team introduced docker exec command: https://docs.docker.com/engine/reference/commandline/exec/

So now you can run any command in a running container just knowing its ID (or name):

docker exec -it <container_id_or_name> echo "Hello from container!" 

Note that exec command works only on already running container. If the container is currently stopped, you need to first run it with the following command:

docker run -it -d shykes/pybuilder /bin/bash 

The most important thing here is the -d option, which stands for detached. It means that the command you initially provided to the container (/bin/bash) will be run in the background and the container will not stop immediately.

Sign up to request clarification or add additional context in comments.

14 Comments

This doesn't work on a stopped container, only a running one. So if you have a container that immediately stops itself, as in the question, this won't actually work to get something else running inside it.
@interfect is right, and CDR LDN has a more comprehensive answer.
@Jan-PhilipGehrcke Btw this person's username has changed from CDR LDN to cdrev for the answer below (stackoverflow.com/a/26181666/149428).
Why passing -it?
omg why is this so complicated? Seems like the most basic thing you'd need to do. We must not be using it the way they intend.
|
315

Your container will exit as the command you gave it will end. Use the following options to keep it live:

  • -i Keep STDIN open even if not attached.
  • -t Allocate a pseudo-TTY.

So your new run command is:

docker run -it -d shykes/pybuilder bin/bash 

If you would like to attach to an already running container:

docker exec -it CONTAINER_ID /bin/bash 

In these examples /bin/bash is used as the command.

3 Comments

Tried docker exec -it CONTAINER_ID /bin/bash -c "export VAR=1 && echo $VAR" and printed empty variable (expected 1). What am I missing?
after running 'docker exec -it CONTAINER_ID /bin/bash' it goes to the bash correctly but cannot interact with it.
But If I am using docker-compose the -it is not available.
233

So I think the answer is simpler than many misleading answers above.

To start an existing container which is stopped

docker start <container-name/ID> 

To stop a running container

docker stop <container-name/ID> 

Then to login to the interactive shell of a container

docker exec -it <container-name/ID> bash 

To start an existing container and attach to it in one command

docker start -ai <container-name/ID> 

Beware, this will stop the container on exit. But in general, you need to start the container, attach and stop it after you are done.

6 Comments

docker attach <container-name/ID> which is running
@Peter T. Actually, I found your answer a lot more concise than what others have provided. I don't understand why people prefer to complicate a very simple question. Thanks Peter this answer.
this requires that when you did docker create, you did it with -it stackoverflow.com/questions/45216612/… otherwise it won't start.. so you'd do docker start <container-id> and then docker ps -l and you'd see it's not up after the start. and then the attach would fail. So gotta create with -it too.
The question title is misleading, and the author should've approved this as the correct answer.
I execute docker start -ai <ID> and it stops instantly. So I cannot enter insede container. How should the container be created so that it will allow entry?
|
108

To expand on katrmr's answer, if the container is stopped and can't be started due to an error, you'll need to commit it to an image. Then you can launch bash in the new image:

docker commit [CONTAINER_ID] temporary_image docker run --entrypoint=bash -it temporary_image 

1 Comment

FYI, I do this so much that I've put together a command called dshell to do it automatically in a variety of situations - github.com/avirshup/docker-cli-sugar
43

Some of the answers here are misleading because they concern containers that are running, not stopped.

Sven Dowideit explained on the Docker forum that containers are bound to their process (and Docker can't change the process of a stopped container, seemingly due at least to its internal structure: https://github.com/docker/docker/issues/1437). So, basically the only option is to commit the container to an image and run it with a different command.

See https://forums.docker.com/t/run-command-in-stopped-container/343
(I believe the "ENTRYPOINT with arguments" approach wouldn't work either, since you still wouldn't be able to change the arguments to a stopped container.)

3 Comments

Notice: running bin/bash without -it wouldn't change anything in the container, so committing it isn't really necessary and CDR LDN gives the right answer for the OP's particular situation. Still, commit is the answer to the technical problem of how to change the container process.
The comment by candlerb at run-command-in-stopped-container suggesting to use a throwaway image with the volume from the inactive container worked for me: docker run --rm --volumes-from CONTAINER -i busybox tar cO /var/DIR | gzip -c > ~/mydir_backup.tgz
This is the actual answer to the question asked. Containers are bound to their process, so the command can't be changed.
26

I had to use bash -c to run my command: docker exec -it CONTAINER_ID bash -c "mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql"

2 Comments

-c worked for me. wonder why bash alone wouldn't work (doesn't get a prompt)
doing /bin/bash -c "<cmd>" ended up working.
20

Creating a container and sending commands to it, one by one:

docker create --name=my_new_container -it ubuntu docker start my_new_container // ps -a says 'Up X seconds' docker exec my_new_container /path/to/my/command // ps -a still says 'Up X+Y seconds' docker exec my_new_container /path/to/another/command 

1 Comment

This is the good answer to the question. If you want to start the container after creation and be able to "docker exec" commands into it, you have to create it with the "-it" flags in the docker create command.
12

If you are trying to run shell script, you need run it as bash.

docker exec -it containerid bash -c /path/to/your/script.sh 

Comments

10

Pipe a command to docker exec bash stdin

You must remove the -t for it to work:

echo 'touch myfile' | docker exec -i CONTAINER_NAME bash 

This can be more convenient that using CLI options sometimes.

Tested with:

docker run --name ub16 -it ubuntu:16.04 bash 

then on another shell:

echo 'touch myfile' | docker exec -i ub16 bash 

Then on first shell:

ls -l myfile 

Tested on Docker 1.13.1, Ubuntu 16.04 host.

1 Comment

You don't need sudo. You just need to be in the docker group.
9

I would like to note that the top answer is a little misleading.

The issue with executing docker run is that a new container is created every time. However, there are cases where we would like to revisit old containers or not take up space with new containers.

(Given clever_bardeen is the name of the container created...)

In OP's case, make sure the docker image is first running by executing the following command:

docker start clever_bardeen 

Then, execute the docker container using the following command:

docker exec -it clever_bardeen /bin/bash 

Comments

8

This is a combined answer I made up using the CDR LDN answer above and the answer I found here.

The following example starts an Arch Linux container from an image, and then installs git on that container using the pacman tool:

sudo docker run -it -d archlinux /bin/bash sudo docker ps -l sudo docker exec -it [container_ID] script /dev/null -c "pacman -S git --noconfirm" 

That is all.

Comments

5

I usually use this:

docker exec -it my-container-name bash 

to continuously interact with a running container.

4 Comments

The whole point is that, you cannot run this command on a exited container. It shows the following error: Error response from daemon: Container 31ed0... is not running
@AshishPratap What a strange error! I just runned "docker exec -it e47e2ece292a bash" and it works properly. Maybe you need to update the Docker?
are you sure that when you ran this command your container was not in running state already?
@AshishPratap Ooo you are right, my mistake. This command can not be executed in a stopped container
3

Assuming the image is using the default entrypoint /bin/sh -c, running /bin/bash will exit immediately in daemon mode (-d). If you want this container to run an interactive shell, use -it instead of -d. If you want to execute arbitrary commands in a container usually executing another process, you might want to try nsenter or nsinit. Have a look at https://blog.codecentric.de/en/2014/07/enter-docker-container/ for the details.

Comments

3

Unfortunately it is impossible to override ENTRYPOINT with arguments with docker run --entrypoint to achieve this goal.

Note: you can override the ENTRYPOINT setting using --entrypoint, but this can only set the binary to exec (no sh -c will be used).

Comments

3

For Mac:

$ docker exec -it <container-name> sh 

if you want to connect as root user:

$ docker exec -u 0 -it <container-name> sh 

Comments

1

Simple answer: start and attach at the same time. In this case you are doing exactly what you asked for.

docker start <CONTAINER_ID/CONTAINER_NAME> && docker attach <CONTAINER_ID/CONTAINER_NAME> 

make sure to change <CONTAINER_ID/CONTAINER_NAME>

Comments

1

I am running windows container and I need to look inside the docker container for files and folder created and copied.

In order to do that I used following docker entrypoint command to get the command prompt running inside the container or attach to the container.

ENTRYPOINT ["C:\\Windows\\System32\\cmd.exe", "-D", "FOREGROUND"] 

That helped me both to the command prompt attach to container and to keep the container a live. :)

Comments

1

In my case, I figured that I had to use the -i option when I create a container to be able to keep it running (not exiting immediately) when I start it using the docker start <container_name/container_id> command.

Let's say, I want to run an Ubuntu container. Let's try creating the container with and without the -i option to see the difference in action.

I'll also use -t option to see a pseudo-terminal when I run the docker attach <container_name/container_id> command to attach to the container.

Creating a container without the -i option

# Listing existing images $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE # Listing existing containers $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # Pulling ubuntu image from the Docker Hub $ docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu a48641193673: Pull complete Digest: sha256:6042500cf4b44023ea1894effe7890666b0c5c7871ed83a97c36c76ae560bb9b Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest # Listing existing images $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 174c8c134b2a 3 weeks ago 77.9MB # Creating a container from the ubuntu image without the `-i` option $ docker create ubuntu e1a1e3a8996a268d3cad7b0f7dc35a57f308034f05fe34436ad38d93559e516a # Listing existing containers $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1a1e3a8996a ubuntu "/bin/bash" 3 seconds ago Created recursing_mcnulty # Starting the container named "recursing_mcnulty" $ docker start recursing_mcnulty recursing_mcnulty # Listing existing containers (STATUS says Exited because it was started and then exited immediately) $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1a1e3a8996a ubuntu "/bin/bash" 3 minutes ago Exited (0) 7 seconds ago recursing_mcnulty # Attaching to the container named "recursing_mcnulty" won't work obviously $ docker attach recursing_mcnulty You cannot attach to a stopped container, start it first 

Creating a container with the -i option

# Listing existing images $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 174c8c134b2a 3 weeks ago 77.9MB # Listing existing containers $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e1a1e3a8996a ubuntu "/bin/bash" 5 minutes ago Exited (0) 2 minutes ago recursing_mcnulty # Creating a container from the ubuntu image with the `-i` option $ docker create -it ubuntu a9a61f197058538e11e9c4e1327f270ca391eb461cb46ea5e140d3cf260c7ac3 # Listing existing containers $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a9a61f197058 ubuntu "/bin/bash" 13 seconds ago Created vigorous_mendeleev e1a1e3a8996a ubuntu "/bin/bash" 7 minutes ago Exited (0) 5 minutes ago recursing_mcnulty # Starting the container named "vigorous_mendeleev" $ docker start vigorous_mendeleev vigorous_mendeleev # Listing existing containers (STATUS says Up this time) $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a9a61f197058 ubuntu "/bin/bash" About a minute ago Up 13 seconds vigorous_mendeleev e1a1e3a8996a ubuntu "/bin/bash" 8 minutes ago Exited (0) 6 minutes ago recursing_mcnulty # Attaching to the container named "vigorous_mendeleev" will work now $ docker attach vigorous_mendeleev root@a9a61f197058:/# # And the shell is interactive as well root@a9a61f197058:/# ls bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var 

Comments

0
# docker exec -d container_id command 

Ex:

# docker exec -d xcdefrdtt service jira stop 

Comments

0

A quick way to resume and access the most recently exited container:

docker start -a -i `docker ps -q -l` 

Comments

0

An easy solution that solved a similar problem for me:

docker run --interactive --tty <name_of_image> 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.