docker exec
Refer to the options section for an overview of available OPTIONS for this command.
Description
The docker exec command runs a new command in a running container.
The command started using docker exec only runs while the container’s primary process ( PID 1 ) is running, and it is not restarted if the container is restarted.
COMMAND runs in the default directory of the container. If the underlying image has a custom directory specified with the WORKDIR directive in its Dockerfile, this directory is used instead.
COMMAND must be an executable. A chained or a quoted command does not work. For example, docker exec -it my_container sh -c «echo a && echo b» does work, but docker exec -it my_container «echo a && echo b» does not.
For example uses of this command, refer to the examples section below.
Options
| Name, shorthand | Default | Description |
| —detach , -d | Detached mode: run command in the background | |
| —detach-keys | Override the key sequence for detaching a container | |
| —env , -e | Set environment variables | |
| —env-file | Read in a file of environment variables | |
| —interactive , -i | Keep STDIN open even if not attached | |
| —privileged | Give extended privileges to the command | |
| —tty , -t | Allocate a pseudo-TTY | |
| —user , -u | Username or UID (format: <name|uid>[:<group|gid>] ) | |
| —workdir , -w | Working directory inside the container |
Examples
Run docker exec on a running container
First, start a container.
This creates and starts a container named mycontainer from an alpine image with an sh shell as its main process. The -d option (shorthand for —detach ) sets the container to run in the background, in detached mode, with a pseudo-TTY attached ( -t ). The -i option is set to keep STDIN attached ( -i ), which prevents the sh process from exiting immediately.
Next, execute a command on the container.
This creates a new file /tmp/execWorks inside the running container mycontainer , in the background.
Next, execute an interactive sh shell on the container.
This starts a new shell session in the container mycontainer .
Set environment variables for the exec process (—env, -e)
Next, set environment variables in the current bash session.
By default, the docker exec command, inherits the environment variables that are set at the time the container is created. Use the —env (or the -e shorthand) to override global environment variables, or to set additional environment variables for the process started by docker exec .
The example below creates a new shell session in the container mycontainer with environment variables $VAR_A and $VAR_B set to “1” and “2” respectively. These environment variables are only valid for the sh process started by that docker exec command, and are not available to other processes running inside the container.
Set the working directory for the exec process (—workdir, -w)
By default docker exec command runs in the same working directory set when the container was created.
You can specify an alternative working directory for the command to execute using the —workdir option (or the -w shorthand):
Try to run docker exec on a paused container
If the container is paused, then the docker exec command fails with an error:
Как подключиться к контейнеру Docker
Сегодня мы продолжим говорить про управление контейнерами Docker и в этой статье я хочу рассказать о том как подключиться к контейнеру. Это можно сделать двумя способами. Либо при создании контейнера передав специальные опции команде docker run или к уже работающему контейнеру с помощью команды docker attach.
Если контейнер уже создан, но в нём есть ошибка и он не запускается, подключится к нему не получится. Нельзя запустить существующий контейнер и сразу же к нему подключится потому что в контейнере должна быть одна основная команда, пока она выполняется контейнер будет работать. При создании можно заменить эту команду на /bin/bash и спокойно с ним работать. При запуске контейнера ничего менять нельзя.
Как подключиться к контейнеру Docker
Дальше мы рассмотрим оба способа, но давайте начнём с создания контейнера. Подробнее об этом рассказано здесь. Чтобы сразу же после создания контейнера подключится к нему надо передать опции -it, а также указать основную программу контейнера, для работы в терминале нам понадобится /bin/bash. Опция -i указывает что надо работать интерактивно, а -t привязывает к контейнеру псевдоконсоль:
docker run -it ubuntu /bin/bash

Теперь вы находитесь в командной оболочке контейнера и он будет запущен пока будет запущена эта оболочка. Если вы выполните команду exit, контейнер завершится. При создании контейнера можно указать его имя чтобы к нему было легче обращаться:
docker run —name losst_ubuntu -it ubuntu /bin/bash
Теперь вы можете отключится от этого контейнера выполнив команду exit, а затем запустить его:
docker start losst_ubuntu
По умолчанию контейнер запускается в фоновом режиме, чтобы как и в предыдущем случае получить доступ к выводу основной программы используйте опцию -i:
docker start -i losst_ubuntu

Если контейнер уже запущен и вы хотите подключится к терминалу, в который выводится вывод основной команды, используйте команду attach:
docker attach -i losst_ubuntu
Обратите внимание, что это не всегда будет командная строка, в которой можно выполнять команды. Так будет только если при создании контейнера главной программой была выбрана командная оболочка. Например, при запуске mysql вы увидите только вывод сервиса mysql:
docker run —name losst_mysql -e MYSQL_ROOT_PASSWORD=password -it mysql

Как вы понимаете, к такому контейнеру не получится подключится для выполнения команд выше описанным способом. Если мы переопределим основную программу mysql больше не будет выполняться и нам от контейнера будет мало толку. Для таких случаев существует команда exec. Она позволяет создать новую сессию и выполнить в ней любую команду, например, ту же командную оболочку. Если вы не знаете имя контейнера, его можно посмотреть командой docker ps:

Если нужный вам контейнер сейчас не запущен используйте опцию -a. Обращаться к контейнеру можно по его имени, например, losst_mysql или по его идентификатору, например, ee81e6ea7373. К тому же если вы не задали имя вручную, то контейнер получит автоматически сгенерированное имя и оно тоже вполне читаемо. Например, пока контейнер losst_mysql работает мы можем к нему подключится:
docker exec -it losst_mysql /bin/bash

Если вы закроете эту сессию, с контейнером ничего не произойдёт, он не завершится, просто закроется текущая сессия. Так что это самый верный способ подключится к контейнеру Docker.
Выводы
В этой статье мы рассмотрели как подключится к контейнеру Docker для выполнения команд внутри контейнера или для того чтобы посмотреть вывод основной команды. Как видите, всё просто.
Docker: Enter Container
The docker exec command serves for executing commands in running Docker containers.
With this command it is also possible to enter a running Docker container and start a bash session.
In this post i am showing how to enter a Docker container and execute an interactive bash shell inside it.
Cool Tip: Copying files and folders between host and Docker-containers! Read More →
How To Enter A Docker Container
Find out a container’s name or ID with the docker ps command:
Enter a Docker container by name or ID and start a bash shell:
If the bash shell is not found, you will get the message as follows:
oci runtime error: exec failed: container_linux.go:265: starting container process caused “exec: \”bash\”: executable file not found in $PATH”
In this case you can enter a Docker container and start a simple sh shell:
How do I get into a Docker container's shell?
I’m getting started working with Docker. I’m using the WordPress base image and docker-compose.
I’m trying to ssh into one of the containers to inspect the files/directories that were created during the initial build. I tried to run docker-compose run containername ls -la , but that didn’t do anything. Even if it did, I’d rather have a console where I can traverse the directory structure, rather than run a single command. What is the right way to do this with Docker?
31 Answers 31
docker attach will let you connect to your Docker container, but this isn’t really the same thing as ssh . If your container is running a webserver, for example, docker attach will probably connect you to the stdout of the web server process. It won’t necessarily give you a shell.
The docker exec command is probably what you are looking for; this will let you run arbitrary commands inside an existing container. For example:
Of course, whatever command you are running must exist in the container filesystem.