command: docker container exec aliases: docker container exec, docker exec short: Execute a command in a running container long: |- The `docker exec` command runs a new command in a running container. The command you specify with `docker exec` only runs while the container's primary process (`PID 1`) is running, and it isn't restarted if the container is restarted. The command runs in the default working directory of the container. The command must be an executable. A chained or a quoted command doesn't work. - This works: `docker exec -it my_container sh -c "echo a && echo b"` - This doesn't work: `docker exec -it my_container "echo a && echo b"` usage: docker container exec [OPTIONS] CONTAINER COMMAND [ARG...] pname: docker container plink: docker_container.yaml options: - option: detach shorthand: d value_type: bool default_value: "false" description: 'Detached mode: run command in the background' deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false - option: detach-keys value_type: string description: Override the key sequence for detaching a container deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false - option: env shorthand: e value_type: list description: Set environment variables details_url: '#env' deprecated: false hidden: false min_api_version: "1.25" experimental: false experimentalcli: false kubernetes: false swarm: false - option: env-file value_type: list description: Read in a file of environment variables deprecated: false hidden: false min_api_version: "1.25" experimental: false experimentalcli: false kubernetes: false swarm: false - option: interactive shorthand: i value_type: bool default_value: "false" description: Keep STDIN open even if not attached deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false - option: privileged value_type: bool default_value: "false" description: Give extended privileges to the command details_url: '#privileged' deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false - option: tty shorthand: t value_type: bool default_value: "false" description: Allocate a pseudo-TTY deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false - option: user shorthand: u value_type: string description: 'Username or UID (format: `[:]`)' deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false - option: workdir shorthand: w value_type: string description: Working directory inside the container details_url: '#workdir' deprecated: false hidden: false min_api_version: "1.35" experimental: false experimentalcli: false kubernetes: false swarm: false inherited_options: - option: help value_type: bool default_value: "false" description: Print usage deprecated: false hidden: true experimental: false experimentalcli: false kubernetes: false swarm: false examples: |- ### Run `docker exec` on a running container First, start a container. ```console $ docker run --name mycontainer -d -i -t alpine /bin/sh ``` 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 mycontainer touch /tmp/execWorks ``` This creates a new file `/tmp/execWorks` inside the running container `mycontainer`, in the background. Next, execute an interactive `sh` shell on the container. ```console $ docker exec -it mycontainer sh ``` This starts a new shell session in the container `mycontainer`. ### Set environment variables for the exec process (--env, -e) {#env} Next, set environment variables in the current bash session. 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 following example creates a new shell session in the container `mycontainer`, with environment variables `$VAR_A` set to `1`, and `$VAR_B` set to `2`. These environment variables are only valid for the `sh` process started by that `docker exec` command, and aren't available to other processes running inside the container. ```console $ 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 ``` ### Escalate container privileges (--privileged) {#privileged} See [`docker run --privileged`](/reference/cli/docker/container/run/#privileged). ### Set the working directory for the exec process (--workdir, -w) {#workdir} By default `docker exec` command runs in the same working directory set when the container was created. ```console $ docker exec -it mycontainer pwd / ``` 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 mycontainer pwd /root ``` ### Try to run `docker exec` on a paused container If the container is paused, then the `docker exec` command fails with an error: ```console $ docker pause mycontainer mycontainer $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 482efdf39fac alpine "/bin/sh" 17 seconds ago Up 16 seconds (Paused) mycontainer $ docker exec mycontainer sh Error response from daemon: Container mycontainer is paused, unpause the container before exec $ echo $? 1 ``` deprecated: false hidden: false experimental: false experimentalcli: false kubernetes: false swarm: false