How do I run a command on an already existing Docker container?

Docker

Docker Problem Overview


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.

Docker Solutions


Solution 1 - Docker

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.

Solution 2 - Docker

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.

Solution 3 - Docker

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.

Solution 4 - Docker

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

Solution 5 - Docker

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<br /> (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.)

Solution 6 - Docker

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"

Solution 7 - Docker

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

Solution 8 - Docker

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

Solution 9 - Docker

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.

Solution 10 - Docker

Pipe a command to docker exec bash stdin

Must remove the -t for it to work:

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

This can be more convenient that using CLI options sometimes.

Tested with:

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

then on another shell:

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

Then on first shell:

ls -l myfile

Tested on Docker 1.13.1, Ubuntu 16.04 host.

Solution 11 - Docker

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

Solution 12 - Docker

I usually use this:

    docker exec -it my-container-name bash

to continuously interact with a running container.

Solution 13 - Docker

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.

Solution 14 - Docker

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).

Solution 15 - Docker

For Mac:

$ docker exec -it <container-name> sh

if you want to connect as root user:

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

Solution 16 - Docker

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>

Solution 17 - Docker

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. :)

Solution 18 - Docker

# docker exec -d container_id command 

Ex:

# docker exec -d xcdefrdtt service jira stop 

Solution 19 - Docker

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

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

Solution 20 - Docker

An easy solution that solved a similar problem for me:

docker run --interactive --tty <name_of_image>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohnstonView Question on Stackoverflow
Solution 1 - DockerScadgeView Answer on Stackoverflow
Solution 2 - DockercdrevView Answer on Stackoverflow
Solution 3 - DockerPeter T.View Answer on Stackoverflow
Solution 4 - DockerAaron VView Answer on Stackoverflow
Solution 5 - DockerkatrmrView Answer on Stackoverflow
Solution 6 - DockervelopView Answer on Stackoverflow
Solution 7 - Dockerlanglauf.ioView Answer on Stackoverflow
Solution 8 - DockerMrKulliView Answer on Stackoverflow
Solution 9 - DockerimrissView Answer on Stackoverflow
Solution 10 - DockerCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 11 - DockerJoshView Answer on Stackoverflow
Solution 12 - DockerAmin ShojaeiView Answer on Stackoverflow
Solution 13 - DockerAndreas SteffanView Answer on Stackoverflow
Solution 14 - Dockerwieczorek1990View Answer on Stackoverflow
Solution 15 - DockerLyncean PatelView Answer on Stackoverflow
Solution 16 - Dockeruser353305View Answer on Stackoverflow
Solution 17 - DockerJenish RabadiyaView Answer on Stackoverflow
Solution 18 - DockerRajesh GurramView Answer on Stackoverflow
Solution 19 - DockerPierzView Answer on Stackoverflow
Solution 20 - DockerLC117View Answer on Stackoverflow