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