diff --git a/docs/reference/commandline/exec.md b/docs/reference/commandline/exec.md index fab91cbfc1..5449e0a852 100644 --- a/docs/reference/commandline/exec.md +++ b/docs/reference/commandline/exec.md @@ -35,13 +35,13 @@ 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 will run in the default directory of the container. If the -underlying image has a custom directory specified with the WORKDIR directive -in its Dockerfile, this will be used instead. +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 should be an executable, a chained or a quoted command -will not work. Example: `docker exec -ti my_container "echo a && echo b"` will -not work, but `docker exec -ti my_container sh -c "echo a && echo b"` will. +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"` works, +work, but `docker exec -it my_container "echo a && echo b"` does not. ## Examples @@ -50,70 +50,91 @@ not work, but `docker exec -ti my_container sh -c "echo a && echo b"` will. First, start a container. ```console -$ docker run --name ubuntu_bash --rm -i -t ubuntu bash +$ docker run --name mycontainer -d -i -t alpine /bin/sh ``` -This will create a container named `ubuntu_bash` and start a Bash session. +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. ```console -$ docker exec -d ubuntu_bash touch /tmp/execWorks +$ docker exec -d mycontainer touch /tmp/execWorks ``` -This will create a new file `/tmp/execWorks` inside the running container -`ubuntu_bash`, in the background. +This creates a new file `/tmp/execWorks` inside the running container +`mycontainer`, in the background. -Next, execute an interactive `bash` shell on the container. +Next, execute an interactive `sh` shell on the container. ```console -$ docker exec -it ubuntu_bash bash +$ docker exec -it mycontainer sh ``` -This will create a new Bash session in the container `ubuntu_bash`. +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. + ```console -$ docker exec -it -e VAR_A=1 -e VAR_B=2 ubuntu_bash bash +$ docker exec -e VAR_A=1 -e VAR_B=2 mycontainer env +PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +HOSTNAME=f64a4851eb71 +VAR_A=1 +VAR_B=2 +HOME=/root ``` -This will create a new Bash session in the container `ubuntu_bash` with environment -variables `$VAR_A` and `$VAR_B` set to "1" and "2" respectively. Note that these -environment variables will only be valid on the current Bash session. +### Set the working directory for the exec process (--workdir, -w) -By default `docker exec` command runs in the same working directory set when container was created. +By default `docker exec` command runs in the same working directory set when +the container was created. ```console -$ docker exec -it ubuntu_bash pwd +$ docker exec -it mycontainer pwd / ``` -You can select working directory for the command to execute into +You can specify an alternative working directory for the command to execute +using the `--workdir` option (or the `-w` shorthand): ```console -$ docker exec -it -w /root ubuntu_bash pwd +$ docker exec -it -w /root mycontainer pwd /root ``` ### Try to run `docker exec` on a paused container -If the container is paused, then the `docker exec` command will fail with an error: +If the container is paused, then the `docker exec` command fails with an error: ```console -$ docker pause test - -test +$ docker pause mycontainer +mycontainer $ docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -1ae3b36715d2 ubuntu:latest "bash" 17 seconds ago Up 16 seconds (Paused) test +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +482efdf39fac alpine "/bin/sh" 17 seconds ago Up 16 seconds (Paused) mycontainer -$ docker exec test ls +$ docker exec mycontainer sh -FATA[0000] Error response from daemon: Container test is paused, unpause the container before exec +Error response from daemon: Container mycontainer is paused, unpause the container before exec $ echo $? 1