github.com/pwn-term/docker@v0.0.0-20210616085119-6e977cce2565/cli/docs/reference/commandline/run.md (about)

     1  ---
     2  title: "run"
     3  description: "The run command description and usage"
     4  keywords: "run, command, container"
     5  ---
     6  
     7  # run
     8  
     9  ```markdown
    10  Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    11  
    12  Run a command in a new container
    13  
    14  Options:
    15        --add-host value                Add a custom host-to-IP mapping (host:ip) (default [])
    16    -a, --attach value                  Attach to STDIN, STDOUT or STDERR (default [])
    17        --blkio-weight value            Block IO (relative weight), between 10 and 1000
    18        --blkio-weight-device value     Block IO weight (relative device weight) (default [])
    19        --cap-add value                 Add Linux capabilities (default [])
    20        --cap-drop value                Drop Linux capabilities (default [])
    21        --cgroupns string               Cgroup namespace to use
    22                                        'host':    Run the container in the Docker host's cgroup namespace
    23                                        'private': Run the container in its own private cgroup namespace
    24                                        '':        Use the default Docker daemon cgroup namespace specified by the `--default-cgroupns-mode` option
    25        --cgroup-parent string          Optional parent cgroup for the container
    26        --cidfile string                Write the container ID to the file
    27        --cpu-count int                 The number of CPUs available for execution by the container.
    28                                        Windows daemon only. On Windows Server containers, this is
    29                                        approximated as a percentage of total CPU usage.
    30        --cpu-percent int               Limit percentage of CPU available for execution
    31                                        by the container. Windows daemon only.
    32                                        The processor resource controls are mutually
    33                                        exclusive, the order of precedence is CPUCount
    34                                        first, then CPUShares, and CPUPercent last.
    35        --cpu-period int                Limit CPU CFS (Completely Fair Scheduler) period
    36        --cpu-quota int                 Limit CPU CFS (Completely Fair Scheduler) quota
    37    -c, --cpu-shares int                CPU shares (relative weight)
    38        --cpus NanoCPUs                 Number of CPUs (default 0.000)
    39        --cpu-rt-period int             Limit the CPU real-time period in microseconds
    40        --cpu-rt-runtime int            Limit the CPU real-time runtime in microseconds
    41        --cpuset-cpus string            CPUs in which to allow execution (0-3, 0,1)
    42        --cpuset-mems string            MEMs in which to allow execution (0-3, 0,1)
    43    -d, --detach                        Run container in background and print container ID
    44        --detach-keys string            Override the key sequence for detaching a container
    45        --device value                  Add a host device to the container (default [])
    46        --device-cgroup-rule value      Add a rule to the cgroup allowed devices list
    47        --device-read-bps value         Limit read rate (bytes per second) from a device (default [])
    48        --device-read-iops value        Limit read rate (IO per second) from a device (default [])
    49        --device-write-bps value        Limit write rate (bytes per second) to a device (default [])
    50        --device-write-iops value       Limit write rate (IO per second) to a device (default [])
    51        --disable-content-trust         Skip image verification (default true)
    52        --dns value                     Set custom DNS servers (default [])
    53        --dns-option value              Set DNS options (default [])
    54        --dns-search value              Set custom DNS search domains (default [])
    55        --domainname string             Container NIS domain name
    56        --entrypoint string             Overwrite the default ENTRYPOINT of the image
    57    -e, --env value                     Set environment variables (default [])
    58        --env-file value                Read in a file of environment variables (default [])
    59        --expose value                  Expose a port or a range of ports (default [])
    60        --group-add value               Add additional groups to join (default [])
    61        --health-cmd string             Command to run to check health
    62        --health-interval duration      Time between running the check (ns|us|ms|s|m|h) (default 0s)
    63        --health-retries int            Consecutive failures needed to report unhealthy
    64        --health-timeout duration       Maximum time to allow one check to run (ns|us|ms|s|m|h) (default 0s)
    65        --health-start-period duration  Start period for the container to initialize before counting retries towards unstable (ns|us|ms|s|m|h) (default 0s)
    66        --help                          Print usage
    67    -h, --hostname string               Container host name
    68        --init                          Run an init inside the container that forwards signals and reaps processes
    69    -i, --interactive                   Keep STDIN open even if not attached
    70        --io-maxbandwidth string        Maximum IO bandwidth limit for the system drive (Windows only)
    71                                        (Windows only). The format is `<number><unit>`.
    72                                        Unit is optional and can be `b` (bytes per second),
    73                                        `k` (kilobytes per second), `m` (megabytes per second),
    74                                        or `g` (gigabytes per second). If you omit the unit,
    75                                        the system uses bytes per second.
    76                                        --io-maxbandwidth and --io-maxiops are mutually exclusive options.
    77        --io-maxiops uint               Maximum IOps limit for the system drive (Windows only)
    78        --ip string                     IPv4 address (e.g., 172.30.100.104)
    79        --ip6 string                    IPv6 address (e.g., 2001:db8::33)
    80        --ipc string                    IPC namespace to use
    81        --isolation string              Container isolation technology
    82        --kernel-memory string          Kernel memory limit
    83    -l, --label value                   Set meta data on a container (default [])
    84        --label-file value              Read in a line delimited file of labels (default [])
    85        --link value                    Add link to another container (default [])
    86        --link-local-ip value           Container IPv4/IPv6 link-local addresses (default [])
    87        --log-driver string             Logging driver for the container
    88        --log-opt value                 Log driver options (default [])
    89        --mac-address string            Container MAC address (e.g., 92:d0:c6:0a:29:33)
    90    -m, --memory string                 Memory limit
    91        --memory-reservation string     Memory soft limit
    92        --memory-swap string            Swap limit equal to memory plus swap: '-1' to enable unlimited swap
    93        --memory-swappiness int         Tune container memory swappiness (0 to 100) (default -1)
    94        --mount value                   Attach a filesystem mount to the container (default [])
    95        --name string                   Assign a name to the container
    96        --network-alias value           Add network-scoped alias for the container (default [])
    97        --network string                Connect a container to a network
    98                                        'bridge': create a network stack on the default Docker bridge
    99                                        'none': no networking
   100                                        'container:<name|id>': reuse another container's network stack
   101                                        'host': use the Docker host network stack
   102                                        '<network-name>|<network-id>': connect to a user-defined network
   103        --no-healthcheck                Disable any container-specified HEALTHCHECK
   104        --oom-kill-disable              Disable OOM Killer
   105        --oom-score-adj int             Tune host's OOM preferences (-1000 to 1000)
   106        --pid string                    PID namespace to use
   107        --pids-limit int                Tune container pids limit (set -1 for unlimited)
   108        --privileged                    Give extended privileges to this container
   109    -p, --publish value                 Publish a container's port(s) to the host (default [])
   110    -P, --publish-all                   Publish all exposed ports to random ports
   111        --read-only                     Mount the container's root filesystem as read only
   112        --restart string                Restart policy to apply when a container exits (default "no")
   113                                        Possible values are : no, on-failure[:max-retry], always, unless-stopped
   114        --rm                            Automatically remove the container when it exits
   115        --runtime string                Runtime to use for this container
   116        --security-opt value            Security Options (default [])
   117        --shm-size bytes                Size of /dev/shm
   118                                        The format is `<number><unit>`. `number` must be greater than `0`.
   119                                        Unit is optional and can be `b` (bytes), `k` (kilobytes), `m` (megabytes),
   120                                        or `g` (gigabytes). If you omit the unit, the system uses bytes.
   121        --sig-proxy                     Proxy received signals to the process (default true)
   122        --stop-signal string            Signal to stop a container (default "SIGTERM")
   123        --stop-timeout=10               Timeout (in seconds) to stop a container
   124        --storage-opt value             Storage driver options for the container (default [])
   125        --sysctl value                  Sysctl options (default map[])
   126        --tmpfs value                   Mount a tmpfs directory (default [])
   127    -t, --tty                           Allocate a pseudo-TTY
   128        --ulimit value                  Ulimit options (default [])
   129    -u, --user string                   Username or UID (format: <name|uid>[:<group|gid>])
   130        --userns string                 User namespace to use
   131                                        'host': Use the Docker host user namespace
   132                                        '': Use the Docker daemon user namespace specified by `--userns-remap` option.
   133        --uts string                    UTS namespace to use
   134    -v, --volume value                  Bind mount a volume (default []). The format
   135                                        is `[host-src:]container-dest[:<options>]`.
   136                                        The comma-delimited `options` are [rw|ro],
   137                                        [z|Z], [[r]shared|[r]slave|[r]private],
   138                                        [delegated|cached|consistent], and
   139                                        [nocopy]. The 'host-src' is an absolute path
   140                                        or a name value.
   141        --volume-driver string          Optional volume driver for the container
   142        --volumes-from value            Mount volumes from the specified container(s) (default [])
   143    -w, --workdir string                Working directory inside the container
   144  ```
   145  
   146  ## Description
   147  
   148  The `docker run` command first `creates` a writeable container layer over the
   149  specified image, and then `starts` it using the specified command. That is,
   150  `docker run` is equivalent to the API `/containers/create` then
   151  `/containers/(id)/start`. A stopped container can be restarted with all its
   152  previous changes intact using `docker start`. See `docker ps -a` to view a list
   153  of all containers.
   154  
   155  The `docker run` command can be used in combination with `docker commit` to
   156  [*change the command that a container runs*](commit.md). There is additional detailed information about `docker run` in the [Docker run reference](../run.md).
   157  
   158  For information on connecting a container to a network, see the ["*Docker network overview*"](https://docs.docker.com/network/).
   159  
   160  ## Examples
   161  
   162  ### Assign name and allocate pseudo-TTY (--name, -it)
   163  
   164  ```bash
   165  $ docker run --name test -it debian
   166  
   167  root@d6c0fe130dba:/# exit 13
   168  $ echo $?
   169  13
   170  $ docker ps -a | grep test
   171  d6c0fe130dba        debian:7            "/bin/bash"         26 seconds ago      Exited (13) 17 seconds ago                         test
   172  ```
   173  
   174  This example runs a container named `test` using the `debian:latest`
   175  image. The `-it` instructs Docker to allocate a pseudo-TTY connected to
   176  the container's stdin; creating an interactive `bash` shell in the container.
   177  In the example, the `bash` shell is quit by entering
   178  `exit 13`. This exit code is passed on to the caller of
   179  `docker run`, and is recorded in the `test` container's metadata.
   180  
   181  ### Capture container ID (--cidfile)
   182  
   183  ```bash
   184  $ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
   185  ```
   186  
   187  This will create a container and print `test` to the console. The `cidfile`
   188  flag makes Docker attempt to create a new file and write the container ID to it.
   189  If the file exists already, Docker will return an error. Docker will close this
   190  file when `docker run` exits.
   191  
   192  ### Full container capabilities (--privileged)
   193  
   194  ```bash
   195  $ docker run -t -i --rm ubuntu bash
   196  root@bc338942ef20:/# mount -t tmpfs none /mnt
   197  mount: permission denied
   198  ```
   199  
   200  This will *not* work, because by default, most potentially dangerous kernel
   201  capabilities are dropped; including `cap_sys_admin` (which is required to mount
   202  filesystems). However, the `--privileged` flag will allow it to run:
   203  
   204  ```bash
   205  $ docker run -t -i --privileged ubuntu bash
   206  root@50e3f57e16e6:/# mount -t tmpfs none /mnt
   207  root@50e3f57e16e6:/# df -h
   208  Filesystem      Size  Used Avail Use% Mounted on
   209  none            1.9G     0  1.9G   0% /mnt
   210  ```
   211  
   212  The `--privileged` flag gives *all* capabilities to the container, and it also
   213  lifts all the limitations enforced by the `device` cgroup controller. In other
   214  words, the container can then do almost everything that the host can do. This
   215  flag exists to allow special use-cases, like running Docker within Docker.
   216  
   217  ### Set working directory (-w)
   218  
   219  ```bash
   220  $ docker  run -w /path/to/dir/ -i -t  ubuntu pwd
   221  ```
   222  
   223  The `-w` lets the command being executed inside directory given, here
   224  `/path/to/dir/`. If the path does not exist it is created inside the container.
   225  
   226  ### Set storage driver options per container
   227  
   228  ```bash
   229  $ docker run -it --storage-opt size=120G fedora /bin/bash
   230  ```
   231  
   232  This (size) will allow to set the container rootfs size to 120G at creation time.
   233  This option is only available for the `devicemapper`, `btrfs`, `overlay2`,
   234  `windowsfilter` and `zfs` graph drivers.
   235  For the `devicemapper`, `btrfs`, `windowsfilter` and `zfs` graph drivers,
   236  user cannot pass a size less than the Default BaseFS Size.
   237  For the `overlay2` storage driver, the size option is only available if the
   238  backing fs is `xfs` and mounted with the `pquota` mount option.
   239  Under these conditions, user can pass any size less than the backing fs size.
   240  
   241  ### Mount tmpfs (--tmpfs)
   242  
   243  ```bash
   244  $ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image
   245  ```
   246  
   247  The `--tmpfs` flag mounts an empty tmpfs into the container with the `rw`,
   248  `noexec`, `nosuid`, `size=65536k` options.
   249  
   250  ### Mount volume (-v, --read-only)
   251  
   252  ```bash
   253  $ docker  run  -v `pwd`:`pwd` -w `pwd` -i -t  ubuntu pwd
   254  ```
   255  
   256  The `-v` flag mounts the current working directory into the container. The `-w`
   257  lets the command being executed inside the current working directory, by
   258  changing into the directory to the value returned by `pwd`. So this
   259  combination executes the command using the container, but inside the
   260  current working directory.
   261  
   262  ```bash
   263  $ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash
   264  ```
   265  
   266  When the host directory of a bind-mounted volume doesn't exist, Docker
   267  will automatically create this directory on the host for you. In the
   268  example above, Docker will create the `/doesnt/exist`
   269  folder before starting your container.
   270  
   271  ```bash
   272  $ docker run --read-only -v /icanwrite busybox touch /icanwrite/here
   273  ```
   274  
   275  Volumes can be used in combination with `--read-only` to control where
   276  a container writes files. The `--read-only` flag mounts the container's root
   277  filesystem as read only prohibiting writes to locations other than the
   278  specified volumes for the container.
   279  
   280  ```bash
   281  $ docker run -t -i -v /data/docker/run/docker.sock:/data/docker/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh
   282  ```
   283  
   284  By bind-mounting the docker unix socket and statically linked docker
   285  binary (refer to [get the linux binary](https://docs.docker.com/engine/install/binaries/#install-static-binaries)),
   286  you give the container the full access to create and manipulate the host's
   287  Docker daemon.
   288  
   289  On Windows, the paths must be specified using Windows-style semantics.
   290  
   291  ```powershell
   292  PS C:\> docker run -v c:\foo:c:\dest microsoft/nanoserver cmd /s /c type c:\dest\somefile.txt
   293  Contents of file
   294  
   295  PS C:\> docker run -v c:\foo:d: microsoft/nanoserver cmd /s /c type d:\somefile.txt
   296  Contents of file
   297  ```
   298  
   299  The following examples will fail when using Windows-based containers, as the
   300  destination of a volume or bind mount inside the container must be one of:
   301  a non-existing or empty directory; or a drive other than C:. Further, the source
   302  of a bind mount must be a local directory, not a file.
   303  
   304  ```powershell
   305  net use z: \\remotemachine\share
   306  docker run -v z:\foo:c:\dest ...
   307  docker run -v \\uncpath\to\directory:c:\dest ...
   308  docker run -v c:\foo\somefile.txt:c:\dest ...
   309  docker run -v c:\foo:c: ...
   310  docker run -v c:\foo:c:\existing-directory-with-contents ...
   311  ```
   312  
   313  For in-depth information about volumes, refer to [manage data in containers](https://docs.docker.com/storage/volumes/)
   314  
   315  
   316  ### Add bind mounts or volumes using the --mount flag
   317  
   318  The `--mount` flag allows you to mount volumes, host-directories and `tmpfs`
   319  mounts in a container.
   320  
   321  The `--mount` flag supports most options that are supported by the `-v` or the
   322  `--volume` flag, but uses a different syntax. For in-depth information on the
   323  `--mount` flag, and a comparison between `--volume` and `--mount`, refer to
   324  the [service create command reference](service_create.md#add-bind-mounts-volumes-or-memory-filesystems).
   325  
   326  Even though there is no plan to deprecate `--volume`, usage of `--mount` is recommended.
   327  
   328  Examples:
   329  
   330  ```bash
   331  $ docker run --read-only --mount type=volume,target=/icanwrite busybox touch /icanwrite/here
   332  ```
   333  
   334  ```bash
   335  $ docker run -t -i --mount type=bind,src=/data,dst=/data busybox sh
   336  ```
   337  
   338  ### Publish or expose port (-p, --expose)
   339  
   340  ```bash
   341  $ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
   342  ```
   343  
   344  This binds port `8080` of the container to TCP port `80` on `127.0.0.1` of the host
   345  machine. You can also specify `udp` and `sctp` ports.
   346  The [Docker User Guide](https://docs.docker.com/network/links/)
   347  explains in detail how to manipulate ports in Docker.
   348  
   349  Note that ports which are not bound to the host (i.e., `-p 80:80` instead of
   350  `-p 127.0.0.1:80:80`) will be accessible from the outside. This also applies if
   351  you configured UFW to block this specific port, as Docker manages his
   352  own iptables rules. [Read more](https://docs.docker.com/network/iptables/)
   353  
   354  ```bash
   355  $ docker run --expose 80 ubuntu bash
   356  ```
   357  
   358  This exposes port `80` of the container without publishing the port to the host
   359  system's interfaces.
   360  
   361  ### Set environment variables (-e, --env, --env-file)
   362  
   363  ```bash
   364  $ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash
   365  ```
   366  
   367  Use the `-e`, `--env`, and `--env-file` flags to set simple (non-array)
   368  environment variables in the container you're running, or overwrite variables
   369  that are defined in the Dockerfile of the image you're running.
   370  
   371  You can define the variable and its value when running the container:
   372  
   373  ```bash
   374  $ docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR
   375  VAR1=value1
   376  VAR2=value2
   377  ```
   378  
   379  You can also use variables that you've exported to your local environment:
   380  
   381  ```bash
   382  export VAR1=value1
   383  export VAR2=value2
   384  
   385  $ docker run --env VAR1 --env VAR2 ubuntu env | grep VAR
   386  VAR1=value1
   387  VAR2=value2
   388  ```
   389  
   390  When running the command, the Docker CLI client checks the value the variable
   391  has in your local environment and passes it to the container.
   392  If no `=` is provided and that variable is not exported in your local
   393  environment, the variable won't be set in the container.
   394  
   395  You can also load the environment variables from a file. This file should use
   396  the syntax `<variable>=value` (which sets the variable to the given value) or
   397  `<variable>` (which takes the value from the local environment), and `#` for comments.
   398  
   399  ```bash
   400  $ cat env.list
   401  # This is a comment
   402  VAR1=value1
   403  VAR2=value2
   404  USER
   405  
   406  $ docker run --env-file env.list ubuntu env | grep VAR
   407  VAR1=value1
   408  VAR2=value2
   409  USER=denis
   410  ```
   411  
   412  ### Set metadata on container (-l, --label, --label-file)
   413  
   414  A label is a `key=value` pair that applies metadata to a container. To label a container with two labels:
   415  
   416  ```bash
   417  $ docker run -l my-label --label com.example.foo=bar ubuntu bash
   418  ```
   419  
   420  The `my-label` key doesn't specify a value so the label defaults to an empty
   421  string (`""`). To add multiple labels, repeat the label flag (`-l` or `--label`).
   422  
   423  The `key=value` must be unique to avoid overwriting the label value. If you
   424  specify labels with identical keys but different values, each subsequent value
   425  overwrites the previous. Docker uses the last `key=value` you supply.
   426  
   427  Use the `--label-file` flag to load multiple labels from a file. Delimit each
   428  label in the file with an EOL mark. The example below loads labels from a
   429  labels file in the current directory:
   430  
   431  ```bash
   432  $ docker run --label-file ./labels ubuntu bash
   433  ```
   434  
   435  The label-file format is similar to the format for loading environment
   436  variables. (Unlike environment variables, labels are not visible to processes
   437  running inside a container.) The following example illustrates a label-file
   438  format:
   439  
   440  ```console
   441  com.example.label1="a label"
   442  
   443  # this is a comment
   444  com.example.label2=another\ label
   445  com.example.label3
   446  ```
   447  
   448  You can load multiple label-files by supplying multiple  `--label-file` flags.
   449  
   450  For additional information on working with labels, see [*Labels - custom
   451  metadata in Docker*](https://docs.docker.com/config/labels-custom-metadata/) in
   452  the Docker User Guide.
   453  
   454  ### Connect a container to a network (--network)
   455  
   456  When you start a container use the `--network` flag to connect it to a network.
   457  This adds the `busybox` container to the `my-net` network.
   458  
   459  ```bash
   460  $ docker run -itd --network=my-net busybox
   461  ```
   462  
   463  You can also choose the IP addresses for the container with `--ip` and `--ip6`
   464  flags when you start the container on a user-defined network.
   465  
   466  ```bash
   467  $ docker run -itd --network=my-net --ip=10.10.9.75 busybox
   468  ```
   469  
   470  If you want to add a running container to a network use the `docker network connect` subcommand.
   471  
   472  You can connect multiple containers to the same network. Once connected, the
   473  containers can communicate easily need only another container's IP address
   474  or name. For `overlay` networks or custom plugins that support multi-host
   475  connectivity, containers connected to the same multi-host network but launched
   476  from different Engines can also communicate in this way.
   477  
   478  > **Note**
   479  >
   480  > Service discovery is unavailable on the default bridge network. Containers can
   481  > communicate via their IP addresses by default. To communicate by name, they
   482  > must be linked.
   483  
   484  You can disconnect a container from a network using the `docker network
   485  disconnect` command.
   486  
   487  ### Mount volumes from container (--volumes-from)
   488  
   489  ```bash
   490  $ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
   491  ```
   492  
   493  The `--volumes-from` flag mounts all the defined volumes from the referenced
   494  containers. Containers can be specified by repetitions of the `--volumes-from`
   495  argument. The container ID may be optionally suffixed with `:ro` or `:rw` to
   496  mount the volumes in read-only or read-write mode, respectively. By default,
   497  the volumes are mounted in the same mode (read write or read only) as
   498  the reference container.
   499  
   500  Labeling systems like SELinux require that proper labels are placed on volume
   501  content mounted into a container. Without a label, the security system might
   502  prevent the processes running inside the container from using the content. By
   503  default, Docker does not change the labels set by the OS.
   504  
   505  To change the label in the container context, you can add either of two suffixes
   506  `:z` or `:Z` to the volume mount. These suffixes tell Docker to relabel file
   507  objects on the shared volumes. The `z` option tells Docker that two containers
   508  share the volume content. As a result, Docker labels the content with a shared
   509  content label. Shared volume labels allow all containers to read/write content.
   510  The `Z` option tells Docker to label the content with a private unshared label.
   511  Only the current container can use a private volume.
   512  
   513  ### Attach to STDIN/STDOUT/STDERR (-a)
   514  
   515  The `-a` flag tells `docker run` to bind to the container's `STDIN`, `STDOUT`
   516  or `STDERR`. This makes it possible to manipulate the output and input as
   517  needed.
   518  
   519  ```bash
   520  $ echo "test" | docker run -i -a stdin ubuntu cat -
   521  ```
   522  
   523  This pipes data into a container and prints the container's ID by attaching
   524  only to the container's `STDIN`.
   525  
   526  ```bash
   527  $ docker run -a stderr ubuntu echo test
   528  ```
   529  
   530  This isn't going to print anything unless there's an error because we've
   531  only attached to the `STDERR` of the container. The container's logs
   532  still store what's been written to `STDERR` and `STDOUT`.
   533  
   534  ```bash
   535  $ cat somefile | docker run -i -a stdin mybuilder dobuild
   536  ```
   537  
   538  This is how piping a file into a container could be done for a build.
   539  The container's ID will be printed after the build is done and the build
   540  logs could be retrieved using `docker logs`. This is
   541  useful if you need to pipe a file or something else into a container and
   542  retrieve the container's ID once the container has finished running.
   543  
   544  ### Add host device to container (--device)
   545  
   546  ```bash
   547  $ docker run --device=/dev/sdc:/dev/xvdc \
   548               --device=/dev/sdd --device=/dev/zero:/dev/nulo \
   549               -i -t \
   550               ubuntu ls -l /dev/{xvdc,sdd,nulo}
   551  
   552  brw-rw---- 1 root disk 8, 2 Feb  9 16:05 /dev/xvdc
   553  brw-rw---- 1 root disk 8, 3 Feb  9 16:05 /dev/sdd
   554  crw-rw-rw- 1 root root 1, 5 Feb  9 16:05 /dev/nulo
   555  ```
   556  
   557  It is often necessary to directly expose devices to a container. The `--device`
   558  option enables that. For example, a specific block storage device or loop
   559  device or audio device can be added to an otherwise unprivileged container
   560  (without the `--privileged` flag) and have the application directly access it.
   561  
   562  By default, the container will be able to `read`, `write` and `mknod` these devices.
   563  This can be overridden using a third `:rwm` set of options to each `--device`
   564  flag. If the container is running in privileged mode, then the permissions specified
   565  will be ignored.
   566  
   567  ```bash
   568  $ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk  /dev/xvdc
   569  
   570  Command (m for help): q
   571  $ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk  /dev/xvdc
   572  You will not be able to write the partition table.
   573  
   574  Command (m for help): q
   575  
   576  $ docker run --device=/dev/sda:/dev/xvdc:rw --rm -it ubuntu fdisk  /dev/xvdc
   577  
   578  Command (m for help): q
   579  
   580  $ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk  /dev/xvdc
   581  fdisk: unable to open /dev/xvdc: Operation not permitted
   582  ```
   583  
   584  > **Note**
   585  >
   586  > The `--device` option cannot be safely used with ephemeral devices. Block devices
   587  > that may be removed should not be added to untrusted containers with `--device`.
   588  
   589  For Windows, the format of the string passed to the `--device` option is in
   590  the form of `--device=<IdType>/<Id>`. Beginning with Windows Server 2019
   591  and Windows 10 October 2018 Update, Windows only supports an IdType of
   592  `class` and the Id as a [device interface class
   593  GUID](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/overview-of-device-interface-classes).
   594  Refer to the table defined in the [Windows container
   595  docs](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/hardware-devices-in-containers)
   596  for a list of container-supported device interface class GUIDs.
   597  
   598  If this option is specified for a process-isolated Windows container, _all_
   599  devices that implement the requested device interface class GUID are made
   600  available in the container. For example, the command below makes all COM
   601  ports on the host visible in the container.
   602  
   603  ```powershell
   604  PS C:\> docker run --device=class/86E0D1E0-8089-11D0-9CE4-08003E301F73 mcr.microsoft.com/windows/servercore:ltsc2019
   605  ```
   606  
   607  > **Note**
   608  >
   609  > The `--device` option is only supported on process-isolated Windows containers.
   610  > This option fails if the container isolation is `hyperv` or when running Linux
   611  > Containers on Windows (LCOW).
   612  
   613  ### Access an NVIDIA GPU
   614  
   615  The `--gpus­` flag allows you to access NVIDIA GPU resources. First you need to
   616  install [nvidia-container-runtime](https://nvidia.github.io/nvidia-container-runtime/).
   617  Visit [Specify a container's resources](https://docs.docker.com/config/containers/resource_constraints/)
   618  for more information.
   619  
   620  To use `--gpus`, specify which GPUs (or all) to use. If no value is provied, all
   621  available GPUs are used. The example below exposes all available GPUs.
   622  
   623  ```bash
   624  $ docker run -it --rm --gpus all ubuntu nvidia-smi
   625  ```
   626  
   627  Use the `device` option to specify GPUs. The example below exposes a specific
   628  GPU.
   629  
   630  ```bash
   631  $ docker run -it --rm --gpus device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a ubuntu nvidia-smi
   632  ```
   633  
   634  The example below exposes the first and third GPUs.
   635  
   636  ```bash
   637  $ docker run -it --rm --gpus device=0,2 nvidia-smi
   638  ```
   639  
   640  ### Restart policies (--restart)
   641  
   642  Use Docker's `--restart` to specify a container's *restart policy*. A restart
   643  policy controls whether the Docker daemon restarts a container after exit.
   644  Docker supports the following restart policies:
   645  
   646  | Policy                     | Result                                                                                                                                                                                                                                                           |
   647  |:---------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
   648  | `no`                       | Do not automatically restart the container when it exits. This is the default.                                                                                                                                                                                   |
   649  | `on-failure[:max-retries]` | Restart only if the container exits with a non-zero exit status. Optionally, limit the number of restart retries the Docker daemon attempts.                                                                                                                     |
   650  | `unless-stopped`           | Restart the container unless it is explicitly stopped or Docker itself is stopped or restarted.                                                                                                                                                                  |
   651  | `always`                   | Always restart the container regardless of the exit status. When you specify always, the Docker daemon will try to restart the container indefinitely. The container will also always start on daemon startup, regardless of the current state of the container. |
   652  
   653  ```bash
   654  $ docker run --restart=always redis
   655  ```
   656  
   657  This will run the `redis` container with a restart policy of **always**
   658  so that if the container exits, Docker will restart it.
   659  
   660  More detailed information on restart policies can be found in the
   661  [Restart Policies (--restart)](../run.md#restart-policies---restart)
   662  section of the Docker run reference page.
   663  
   664  ### Add entries to container hosts file (--add-host)
   665  
   666  You can add other hosts into a container's `/data/data/hilled.pwnterm/files/usr/etc/hosts` file by using one or
   667  more `--add-host` flags. This example adds a static address for a host named
   668  `docker`:
   669  
   670  ```bash
   671  $ docker run --add-host=docker:10.180.0.1 --rm -it debian
   672  
   673  root@f38c87f2a42d:/# ping docker
   674  PING docker (10.180.0.1): 48 data bytes
   675  56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
   676  56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
   677  ^C--- docker ping statistics ---
   678  2 packets transmitted, 2 packets received, 0% packet loss
   679  round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms
   680  ```
   681  
   682  Sometimes you need to connect to the Docker host from within your
   683  container. To enable this, pass the Docker host's IP address to
   684  the container using the `--add-host` flag. To find the host's address,
   685  use the `ip addr show` command.
   686  
   687  The flags you pass to `ip addr show` depend on whether you are
   688  using IPv4 or IPv6 networking in your containers. Use the following
   689  flags for IPv4 address retrieval for a network device named `eth0`:
   690  
   691  ```bash
   692  $ HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print $2}' | cut -d / -f 1 | sed -n 1p`
   693  $ docker run  --add-host=docker:${HOSTIP} --rm -it debian
   694  ```
   695  
   696  For IPv6 use the `-6` flag instead of the `-4` flag. For other network
   697  devices, replace `eth0` with the correct device name (for example `docker0`
   698  for the bridge device).
   699  
   700  ### Set ulimits in container (--ulimit)
   701  
   702  Since setting `ulimit` settings in a container requires extra privileges not
   703  available in the default container, you can set these using the `--ulimit` flag.
   704  `--ulimit` is specified with a soft and hard limit as such:
   705  `<type>=<soft limit>[:<hard limit>]`, for example:
   706  
   707  ```bash
   708  $ docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
   709  1024
   710  ```
   711  
   712  > **Note**
   713  >
   714  > If you do not provide a `hard limit`, the `soft limit` is used
   715  > for both values. If no `ulimits` are set, they are inherited from
   716  > the default `ulimits` set on the daemon. The `as` option is disabled now.
   717  > In other words, the following script is not supported:
   718  >
   719  > ```bash
   720  > $ docker run -it --ulimit as=1024 fedora /bin/bash`
   721  > ```
   722  
   723  The values are sent to the appropriate `syscall` as they are set.
   724  Docker doesn't perform any byte conversion. Take this into account when setting the values.
   725  
   726  #### For `nproc` usage
   727  
   728  Be careful setting `nproc` with the `ulimit` flag as `nproc` is designed by Linux to set the
   729  maximum number of processes available to a user, not to a container.  For example, start four
   730  containers with `daemon` user:
   731  
   732  ```bash
   733  $ docker run -d -u daemon --ulimit nproc=3 busybox top
   734  
   735  $ docker run -d -u daemon --ulimit nproc=3 busybox top
   736  
   737  $ docker run -d -u daemon --ulimit nproc=3 busybox top
   738  
   739  $ docker run -d -u daemon --ulimit nproc=3 busybox top
   740  ```
   741  
   742  The 4th container fails and reports "[8] System error: resource temporarily unavailable" error.
   743  This fails because the caller set `nproc=3` resulting in the first three containers using up
   744  the three processes quota set for the `daemon` user.
   745  
   746  ### Stop container with signal (--stop-signal)
   747  
   748  The `--stop-signal` flag sets the system call signal that will be sent to the container to exit.
   749  This signal can be a valid unsigned number that matches a position in the kernel's syscall table, for instance 9,
   750  or a signal name in the format SIGNAME, for instance SIGKILL.
   751  
   752  ### Optional security options (--security-opt)
   753  
   754  On Windows, this flag can be used to specify the `credentialspec` option.
   755  The `credentialspec` must be in the format `file://spec.txt` or `registry://keyname`.
   756  
   757  ### Stop container with timeout (--stop-timeout)
   758  
   759  The `--stop-timeout` flag sets the timeout (in seconds) that a pre-defined (see `--stop-signal`) system call
   760  signal that will be sent to the container to exit. After timeout elapses the container will be killed with SIGKILL.
   761  
   762  ### Specify isolation technology for container (--isolation)
   763  
   764  This option is useful in situations where you are running Docker containers on
   765  Windows. The `--isolation <value>` option sets a container's isolation technology.
   766  On Linux, the only supported is the `default` option which uses
   767  Linux namespaces. These two commands are equivalent on Linux:
   768  
   769  ```bash
   770  $ docker run -d busybox top
   771  $ docker run -d --isolation default busybox top
   772  ```
   773  
   774  On Windows, `--isolation` can take one of these values:
   775  
   776  
   777  | Value     | Description                                                                                                       |
   778  |:----------|:------------------------------------------------------------------------------------------------------------------|
   779  | `default` | Use the value specified by the Docker daemon's `--exec-opt` or system default (see below).                        |
   780  | `process` | Shared-kernel namespace isolation (not supported on Windows client operating systems older than Windows 10 1809). |
   781  | `hyperv`  | Hyper-V hypervisor partition-based isolation.                                                                     |
   782  
   783  The default isolation on Windows server operating systems is `process`. The default
   784  isolation on Windows client operating systems is `hyperv`. An attempt to start a container on a client
   785  operating system older than Windows 10 1809 with `--isolation process` will fail.
   786  
   787  On Windows server, assuming the default configuration, these commands are equivalent
   788  and result in `process` isolation:
   789  
   790  ```powershell
   791  PS C:\> docker run -d microsoft/nanoserver powershell echo process
   792  PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo process
   793  PS C:\> docker run -d --isolation process microsoft/nanoserver powershell echo process
   794  ```
   795  
   796  If you have set the `--exec-opt isolation=hyperv` option on the Docker `daemon`, or
   797  are running against a Windows client-based daemon, these commands are equivalent and
   798  result in `hyperv` isolation:
   799  
   800  ```powershell
   801  PS C:\> docker run -d microsoft/nanoserver powershell echo hyperv
   802  PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo hyperv
   803  PS C:\> docker run -d --isolation hyperv microsoft/nanoserver powershell echo hyperv
   804  ```
   805  
   806  ### Specify hard limits on memory available to containers (-m, --memory)
   807  
   808  These parameters always set an upper limit on the memory available to the container. On Linux, this
   809  is set on the cgroup and applications in a container can query it at `/sys/fs/cgroup/memory/memory.limit_in_bytes`.
   810  
   811  On Windows, this will affect containers differently depending on what type of isolation is used.
   812  
   813  - With `process` isolation, Windows will report the full memory of the host system, not the limit to applications running inside the container
   814  
   815      ```powershell
   816      PS C:\> docker run -it -m 2GB --isolation=process microsoft/nanoserver powershell Get-ComputerInfo *memory*
   817  
   818      CsTotalPhysicalMemory      : 17064509440
   819      CsPhyicallyInstalledMemory : 16777216
   820      OsTotalVisibleMemorySize   : 16664560
   821      OsFreePhysicalMemory       : 14646720
   822      OsTotalVirtualMemorySize   : 19154928
   823      OsFreeVirtualMemory        : 17197440
   824      OsInUseVirtualMemory       : 1957488
   825      OsMaxProcessMemorySize     : 137438953344
   826      ```
   827  
   828  - With `hyperv` isolation, Windows will create a utility VM that is big enough to hold the memory limit, plus the minimal OS needed to host the container. That size is reported as "Total Physical Memory."
   829  
   830      ```powershell
   831      PS C:\> docker run -it -m 2GB --isolation=hyperv microsoft/nanoserver powershell Get-ComputerInfo *memory*
   832  
   833      CsTotalPhysicalMemory      : 2683355136
   834      CsPhyicallyInstalledMemory :
   835      OsTotalVisibleMemorySize   : 2620464
   836      OsFreePhysicalMemory       : 2306552
   837      OsTotalVirtualMemorySize   : 2620464
   838      OsFreeVirtualMemory        : 2356692
   839      OsInUseVirtualMemory       : 263772
   840      OsMaxProcessMemorySize     : 137438953344
   841      ```
   842  
   843  
   844  ### Configure namespaced kernel parameters (sysctls) at runtime
   845  
   846  The `--sysctl` sets namespaced kernel parameters (sysctls) in the
   847  container. For example, to turn on IP forwarding in the containers
   848  network namespace, run this command:
   849  
   850  ```bash
   851  $ docker run --sysctl net.ipv4.ip_forward=1 someimage
   852  ```
   853  
   854  > **Note**
   855  >
   856  > Not all sysctls are namespaced. Docker does not support changing sysctls
   857  > inside of a container that also modify the host system. As the kernel
   858  > evolves we expect to see more sysctls become namespaced.
   859  
   860  #### Currently supported sysctls
   861  
   862  IPC Namespace:
   863  
   864  - `kernel.msgmax`, `kernel.msgmnb`, `kernel.msgmni`, `kernel.sem`,
   865    `kernel.shmall`, `kernel.shmmax`, `kernel.shmmni`, `kernel.shm_rmid_forced`.
   866  - Sysctls beginning with `fs.mqueue.*`
   867  - If you use the `--ipc=host` option these sysctls are not allowed.
   868  
   869  Network Namespace:
   870  
   871  - Sysctls beginning with `net.*`
   872  - If you use the `--network=host` option using these sysctls are not allowed.