github.com/feiyang21687/docker@v1.5.0/docs/sources/reference/builder.md (about) 1 page_title: Dockerfile Reference 2 page_description: Dockerfiles use a simple DSL which allows you to automate the steps you would normally manually take to create an image. 3 page_keywords: builder, docker, Dockerfile, automation, image creation 4 5 # Dockerfile Reference 6 7 **Docker can build images automatically** by reading the instructions 8 from a `Dockerfile`. A `Dockerfile` is a text document that contains all 9 the commands you would normally execute manually in order to build a 10 Docker image. By calling `docker build` from your terminal, you can have 11 Docker build your image step by step, executing the instructions 12 successively. 13 14 This page discusses the specifics of all the instructions you can use in your 15 `Dockerfile`. To further help you write a clear, readable, maintainable 16 `Dockerfile`, we've also written a [`Dockerfile` Best Practices 17 guide](/articles/dockerfile_best-practices). Lastly, you can test your 18 Dockerfile knowledge with the [Dockerfile tutorial](/userguide/level1). 19 20 ## Usage 21 22 To [*build*](/reference/commandline/cli/#build) an image from a source repository, 23 create a description file called `Dockerfile` at the root of your repository. 24 This file will describe the steps to assemble the image. 25 26 Then call `docker build` with the path of your source repository as the argument 27 (for example, `.`): 28 29 $ sudo docker build . 30 31 The path to the source repository defines where to find the *context* of 32 the build. The build is run by the Docker daemon, not by the CLI, so the 33 whole context must be transferred to the daemon. The Docker CLI reports 34 "Sending build context to Docker daemon" when the context is sent to the daemon. 35 36 > **Warning** 37 > Avoid using your root directory, `/`, as the root of the source repository. The 38 > `docker build` command will use whatever directory contains the Dockerfile as the build 39 > context (including all of its subdirectories). The build context will be sent to the 40 > Docker daemon before building the image, which means if you use `/` as the source 41 > repository, the entire contents of your hard drive will get sent to the daemon (and 42 > thus to the machine running the daemon). You probably don't want that. 43 44 In most cases, it's best to put each Dockerfile in an empty directory, and then add only 45 the files needed for building that Dockerfile to that directory. To further speed up the 46 build, you can exclude files and directories by adding a `.dockerignore` file to the same 47 directory. 48 49 You can specify a repository and tag at which to save the new image if 50 the build succeeds: 51 52 $ sudo docker build -t shykes/myapp . 53 54 The Docker daemon will run your steps one-by-one, committing the result 55 to a new image if necessary, before finally outputting the ID of your 56 new image. The Docker daemon will automatically clean up the context you 57 sent. 58 59 Note that each instruction is run independently, and causes a new image 60 to be created - so `RUN cd /tmp` will not have any effect on the next 61 instructions. 62 63 Whenever possible, Docker will re-use the intermediate images, 64 accelerating `docker build` significantly (indicated by `Using cache` - 65 see the [`Dockerfile` Best Practices 66 guide](/articles/dockerfile_best-practices/#build-cache) for more information): 67 68 $ sudo docker build -t SvenDowideit/ambassador . 69 Uploading context 10.24 kB 70 Uploading context 71 Step 1 : FROM docker-ut 72 ---> cbba202fe96b 73 Step 2 : MAINTAINER SvenDowideit@home.org.au 74 ---> Using cache 75 ---> 51182097be13 76 Step 3 : CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' | sh && top 77 ---> Using cache 78 ---> 1a5ffc17324d 79 Successfully built 1a5ffc17324d 80 81 When you're done with your build, you're ready to look into [*Pushing a 82 repository to its registry*]( /userguide/dockerrepos/#contributing-to-docker-hub). 83 84 ## Format 85 86 Here is the format of the `Dockerfile`: 87 88 # Comment 89 INSTRUCTION arguments 90 91 The Instruction is not case-sensitive, however convention is for them to 92 be UPPERCASE in order to distinguish them from arguments more easily. 93 94 Docker runs the instructions in a `Dockerfile` in order. **The 95 first instruction must be \`FROM\`** in order to specify the [*Base 96 Image*](/terms/image/#base-image) from which you are building. 97 98 Docker will treat lines that *begin* with `#` as a 99 comment. A `#` marker anywhere else in the line will 100 be treated as an argument. This allows statements like: 101 102 # Comment 103 RUN echo 'we are running some # of cool things' 104 105 Here is the set of instructions you can use in a `Dockerfile` for building 106 images. 107 108 ### Environment Replacement 109 110 **Note:** prior to 1.3, `Dockerfile` environment variables were handled 111 similarly, in that they would be replaced as described below. However, there 112 was no formal definition on as to which instructions handled environment 113 replacement at the time. After 1.3 this behavior will be preserved and 114 canonical. 115 116 Environment variables (declared with [the `ENV` statement](#env)) can also be used in 117 certain instructions as variables to be interpreted by the `Dockerfile`. Escapes 118 are also handled for including variable-like syntax into a statement literally. 119 120 Environment variables are notated in the `Dockerfile` either with 121 `$variable_name` or `${variable_name}`. They are treated equivalently and the 122 brace syntax is typically used to address issues with variable names with no 123 whitespace, like `${foo}_bar`. 124 125 Escaping is possible by adding a `\` before the variable: `\$foo` or `\${foo}`, 126 for example, will translate to `$foo` and `${foo}` literals respectively. 127 128 Example (parsed representation is displayed after the `#`): 129 130 FROM busybox 131 ENV foo /bar 132 WORKDIR ${foo} # WORKDIR /bar 133 ADD . $foo # ADD . /bar 134 COPY \$foo /quux # COPY $foo /quux 135 136 The instructions that handle environment variables in the `Dockerfile` are: 137 138 * `ENV` 139 * `ADD` 140 * `COPY` 141 * `WORKDIR` 142 * `EXPOSE` 143 * `VOLUME` 144 * `USER` 145 146 `ONBUILD` instructions are **NOT** supported for environment replacement, even 147 the instructions above. 148 149 ## The `.dockerignore` file 150 151 If a file named `.dockerignore` exists in the source repository, then it 152 is interpreted as a newline-separated list of exclusion patterns. 153 Exclusion patterns match files or directories relative to the source repository 154 that will be excluded from the context. Globbing is done using Go's 155 [filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. 156 157 > **Note**: 158 > The `.dockerignore` file can even be used to ignore the `Dockerfile` and 159 > `.dockerignore` files. This might be useful if you are copying files from 160 > the root of the build context into your new containter but do not want to 161 > include the `Dockerfile` or `.dockerignore` files (e.g. `ADD . /someDir/`). 162 163 The following example shows the use of the `.dockerignore` file to exclude the 164 `.git` directory from the context. Its effect can be seen in the changed size of 165 the uploaded context. 166 167 $ sudo docker build . 168 Uploading context 18.829 MB 169 Uploading context 170 Step 0 : FROM busybox 171 ---> 769b9341d937 172 Step 1 : CMD echo Hello World 173 ---> Using cache 174 ---> 99cc1ad10469 175 Successfully built 99cc1ad10469 176 $ echo ".git" > .dockerignore 177 $ sudo docker build . 178 Uploading context 6.76 MB 179 Uploading context 180 Step 0 : FROM busybox 181 ---> 769b9341d937 182 Step 1 : CMD echo Hello World 183 ---> Using cache 184 ---> 99cc1ad10469 185 Successfully built 99cc1ad10469 186 187 ## FROM 188 189 FROM <image> 190 191 Or 192 193 FROM <image>:<tag> 194 195 The `FROM` instruction sets the [*Base Image*](/terms/image/#base-image) 196 for subsequent instructions. As such, a valid `Dockerfile` must have `FROM` as 197 its first instruction. The image can be any valid image – it is especially easy 198 to start by **pulling an image** from the [*Public Repositories*]( 199 /userguide/dockerrepos). 200 201 `FROM` must be the first non-comment instruction in the `Dockerfile`. 202 203 `FROM` can appear multiple times within a single `Dockerfile` in order to create 204 multiple images. Simply make a note of the last image ID output by the commit 205 before each new `FROM` command. 206 207 If no `tag` is given to the `FROM` instruction, `latest` is assumed. If the 208 used tag does not exist, an error will be returned. 209 210 ## MAINTAINER 211 212 MAINTAINER <name> 213 214 The `MAINTAINER` instruction allows you to set the *Author* field of the 215 generated images. 216 217 ## RUN 218 219 RUN has 2 forms: 220 221 - `RUN <command>` (the command is run in a shell - `/bin/sh -c` - *shell* form) 222 - `RUN ["executable", "param1", "param2"]` (*exec* form) 223 224 The `RUN` instruction will execute any commands in a new layer on top of the 225 current image and commit the results. The resulting committed image will be 226 used for the next step in the `Dockerfile`. 227 228 Layering `RUN` instructions and generating commits conforms to the core 229 concepts of Docker where commits are cheap and containers can be created from 230 any point in an image's history, much like source control. 231 232 The *exec* form makes it possible to avoid shell string munging, and to `RUN` 233 commands using a base image that does not contain `/bin/sh`. 234 235 > **Note**: 236 > To use a different shell, other than '/bin/sh', use the *exec* form 237 > passing in the desired shell. For example, 238 > `RUN ["/bin/bash", "-c", "echo hello"]` 239 240 > **Note**: 241 > The *exec* form is parsed as a JSON array, which means that 242 > you must use double-quotes (") around words not single-quotes ('). 243 244 > **Note**: 245 > Unlike the *shell* form, the *exec* form does not invoke a command shell. 246 > This means that normal shell processing does not happen. For example, 247 > `RUN [ "echo", "$HOME" ]` will not do variable substitution on `$HOME`. 248 > If you want shell processing then either use the *shell* form or execute 249 > a shell directly, for example: `RUN [ "sh", "-c", "echo", "$HOME" ]`. 250 251 The cache for `RUN` instructions isn't invalidated automatically during 252 the next build. The cache for an instruction like 253 `RUN apt-get dist-upgrade -y` will be reused during the next build. The 254 cache for `RUN` instructions can be invalidated by using the `--no-cache` 255 flag, for example `docker build --no-cache`. 256 257 See the [`Dockerfile` Best Practices 258 guide](/articles/dockerfile_best-practices/#build-cache) for more information. 259 260 The cache for `RUN` instructions can be invalidated by `ADD` instructions. See 261 [below](#add) for details. 262 263 ### Known Issues (RUN) 264 265 - [Issue 783](https://github.com/docker/docker/issues/783) is about file 266 permissions problems that can occur when using the AUFS file system. You 267 might notice it during an attempt to `rm` a file, for example. The issue 268 describes a workaround. 269 270 ## CMD 271 272 The `CMD` instruction has three forms: 273 274 - `CMD ["executable","param1","param2"]` (*exec* form, this is the preferred form) 275 - `CMD ["param1","param2"]` (as *default parameters to ENTRYPOINT*) 276 - `CMD command param1 param2` (*shell* form) 277 278 There can only be one `CMD` instruction in a `Dockerfile`. If you list more than one `CMD` 279 then only the last `CMD` will take effect. 280 281 **The main purpose of a `CMD` is to provide defaults for an executing 282 container.** These defaults can include an executable, or they can omit 283 the executable, in which case you must specify an `ENTRYPOINT` 284 instruction as well. 285 286 > **Note**: 287 > If `CMD` is used to provide default arguments for the `ENTRYPOINT` 288 > instruction, both the `CMD` and `ENTRYPOINT` instructions should be specified 289 > with the JSON array format. 290 291 > **Note**: 292 > The *exec* form is parsed as a JSON array, which means that 293 > you must use double-quotes (") around words not single-quotes ('). 294 295 > **Note**: 296 > Unlike the *shell* form, the *exec* form does not invoke a command shell. 297 > This means that normal shell processing does not happen. For example, 298 > `CMD [ "echo", "$HOME" ]` will not do variable substitution on `$HOME`. 299 > If you want shell processing then either use the *shell* form or execute 300 > a shell directly, for example: `CMD [ "sh", "-c", "echo", "$HOME" ]`. 301 302 When used in the shell or exec formats, the `CMD` instruction sets the command 303 to be executed when running the image. 304 305 If you use the *shell* form of the `CMD`, then the `<command>` will execute in 306 `/bin/sh -c`: 307 308 FROM ubuntu 309 CMD echo "This is a test." | wc - 310 311 If you want to **run your** `<command>` **without a shell** then you must 312 express the command as a JSON array and give the full path to the executable. 313 **This array form is the preferred format of `CMD`.** Any additional parameters 314 must be individually expressed as strings in the array: 315 316 FROM ubuntu 317 CMD ["/usr/bin/wc","--help"] 318 319 If you would like your container to run the same executable every time, then 320 you should consider using `ENTRYPOINT` in combination with `CMD`. See 321 [*ENTRYPOINT*](#entrypoint). 322 323 If the user specifies arguments to `docker run` then they will override the 324 default specified in `CMD`. 325 326 > **Note**: 327 > don't confuse `RUN` with `CMD`. `RUN` actually runs a command and commits 328 > the result; `CMD` does not execute anything at build time, but specifies 329 > the intended command for the image. 330 331 ## EXPOSE 332 333 EXPOSE <port> [<port>...] 334 335 The `EXPOSE` instructions informs Docker that the container will listen on the 336 specified network ports at runtime. Docker uses this information to interconnect 337 containers using links (see the [Docker User 338 Guide](/userguide/dockerlinks)) and to determine which ports to expose to the 339 host when [using the -P flag](/reference/run/#expose-incoming-ports). 340 **Note:** 341 `EXPOSE` doesn't define which ports can be exposed to the host or make ports 342 accessible from the host by default. To expose ports to the host, at runtime, 343 [use the `-p` flag](/userguide/dockerlinks) or 344 [the -P flag](/reference/run/#expose-incoming-ports). 345 346 ## ENV 347 348 ENV <key> <value> 349 ENV <key>=<value> ... 350 351 The `ENV` instruction sets the environment variable `<key>` to the value 352 `<value>`. This value will be in the environment of all "descendent" `Dockerfile` 353 commands and can be [replaced inline](#environment-replacement) in many as well. 354 355 The `ENV` instruction has two forms. The first form, `ENV <key> <value>`, 356 will set a single variable to a value. The entire string after the first 357 space will be treated as the `<value>` - including characters such as 358 spaces and quotes. 359 360 The second form, `ENV <key>=<value> ...`, allows for multiple variables to 361 be set at one time. Notice that the second form uses the equals sign (=) 362 in the syntax, while the first form does not. Like command line parsing, 363 quotes and backslashes can be used to include spaces within values. 364 365 For example: 366 367 ENV myName="John Doe" myDog=Rex\ The\ Dog \ 368 myCat=fluffy 369 370 and 371 372 ENV myName John Doe 373 ENV myDog Rex The Dog 374 ENV myCat fluffy 375 376 will yield the same net results in the final container, but the first form 377 does it all in one layer. 378 379 The environment variables set using `ENV` will persist when a container is run 380 from the resulting image. You can view the values using `docker inspect`, and 381 change them using `docker run --env <key>=<value>`. 382 383 > **Note**: 384 > Environment persistence can cause unexpected effects. For example, 385 > setting `ENV DEBIAN_FRONTEND noninteractive` may confuse apt-get 386 > users on a Debian-based image. To set a value for a single command, use 387 > `RUN <key>=<value> <command>`. 388 389 ## ADD 390 391 ADD has two forms: 392 393 - `ADD <src>... <dest>` 394 - `ADD ["<src>"... "<dest>"]` (this form is required for paths containing 395 whitespace) 396 397 The `ADD` instruction copies new files, directories or remote file URLs from `<src>` 398 and adds them to the filesystem of the container at the path `<dest>`. 399 400 Multiple `<src>` resource may be specified but if they are files or 401 directories then they must be relative to the source directory that is 402 being built (the context of the build). 403 404 Each `<src>` may contain wildcards and matching will be done using Go's 405 [filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. 406 For most command line uses this should act as expected, for example: 407 408 ADD hom* /mydir/ # adds all files starting with "hom" 409 ADD hom?.txt /mydir/ # ? is replaced with any single character 410 411 The `<dest>` is an absolute path, or a path relative to `WORKDIR`, into which 412 the source will be copied inside the destination container. 413 414 ADD test aDir/ # adds "test" to `WORKDIR`/aDir/ 415 416 All new files and directories are created with a UID and GID of 0. 417 418 In the case where `<src>` is a remote file URL, the destination will 419 have permissions of 600. If the remote file being retrieved has an HTTP 420 `Last-Modified` header, the timestamp from that header will be used 421 to set the `mtime` on the destination file. Then, like any other file 422 processed during an `ADD`, `mtime` will be included in the determination 423 of whether or not the file has changed and the cache should be updated. 424 425 > **Note**: 426 > If you build by passing a `Dockerfile` through STDIN (`docker 427 > build - < somefile`), there is no build context, so the `Dockerfile` 428 > can only contain a URL based `ADD` instruction. You can also pass a 429 > compressed archive through STDIN: (`docker build - < archive.tar.gz`), 430 > the `Dockerfile` at the root of the archive and the rest of the 431 > archive will get used at the context of the build. 432 433 > **Note**: 434 > If your URL files are protected using authentication, you 435 > will need to use `RUN wget`, `RUN curl` or use another tool from 436 > within the container as the `ADD` instruction does not support 437 > authentication. 438 439 > **Note**: 440 > The first encountered `ADD` instruction will invalidate the cache for all 441 > following instructions from the Dockerfile if the contents of `<src>` have 442 > changed. This includes invalidating the cache for `RUN` instructions. 443 > See the [`Dockerfile` Best Practices 444 guide](/articles/dockerfile_best-practices/#build-cache) for more information. 445 446 447 The copy obeys the following rules: 448 449 - The `<src>` path must be inside the *context* of the build; 450 you cannot `ADD ../something /something`, because the first step of a 451 `docker build` is to send the context directory (and subdirectories) to the 452 docker daemon. 453 454 - If `<src>` is a URL and `<dest>` does not end with a trailing slash, then a 455 file is downloaded from the URL and copied to `<dest>`. 456 457 - If `<src>` is a URL and `<dest>` does end with a trailing slash, then the 458 filename is inferred from the URL and the file is downloaded to 459 `<dest>/<filename>`. For instance, `ADD http://example.com/foobar /` would 460 create the file `/foobar`. The URL must have a nontrivial path so that an 461 appropriate filename can be discovered in this case (`http://example.com` 462 will not work). 463 464 - If `<src>` is a directory, the entire contents of the directory are copied, 465 including filesystem metadata. 466 > **Note**: 467 > The directory itself is not copied, just its contents. 468 469 - If `<src>` is a *local* tar archive in a recognized compression format 470 (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources 471 from *remote* URLs are **not** decompressed. When a directory is copied or 472 unpacked, it has the same behavior as `tar -x`: the result is the union of: 473 474 1. Whatever existed at the destination path and 475 2. The contents of the source tree, with conflicts resolved in favor 476 of "2." on a file-by-file basis. 477 478 - If `<src>` is any other kind of file, it is copied individually along with 479 its metadata. In this case, if `<dest>` ends with a trailing slash `/`, it 480 will be considered a directory and the contents of `<src>` will be written 481 at `<dest>/base(<src>)`. 482 483 - If multiple `<src>` resources are specified, either directly or due to the 484 use of a wildcard, then `<dest>` must be a directory, and it must end with 485 a slash `/`. 486 487 - If `<dest>` does not end with a trailing slash, it will be considered a 488 regular file and the contents of `<src>` will be written at `<dest>`. 489 490 - If `<dest>` doesn't exist, it is created along with all missing directories 491 in its path. 492 493 ## COPY 494 495 COPY has two forms: 496 497 - `COPY <src>... <dest>` 498 - `COPY ["<src>"... "<dest>"]` (this form is required for paths containing 499 whitespace) 500 501 The `COPY` instruction copies new files or directories from `<src>` 502 and adds them to the filesystem of the container at the path `<dest>`. 503 504 Multiple `<src>` resource may be specified but they must be relative 505 to the source directory that is being built (the context of the build). 506 507 Each `<src>` may contain wildcards and matching will be done using Go's 508 [filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. 509 For most command line uses this should act as expected, for example: 510 511 COPY hom* /mydir/ # adds all files starting with "hom" 512 COPY hom?.txt /mydir/ # ? is replaced with any single character 513 514 The `<dest>` is an absolute path, or a path relative to `WORKDIR`, into which 515 the source will be copied inside the destination container. 516 517 COPY test aDir/ # adds "test" to `WORKDIR`/aDir/ 518 519 All new files and directories are created with a UID and GID of 0. 520 521 > **Note**: 522 > If you build using STDIN (`docker build - < somefile`), there is no 523 > build context, so `COPY` can't be used. 524 525 The copy obeys the following rules: 526 527 - The `<src>` path must be inside the *context* of the build; 528 you cannot `COPY ../something /something`, because the first step of a 529 `docker build` is to send the context directory (and subdirectories) to the 530 docker daemon. 531 532 - If `<src>` is a directory, the entire contents of the directory are copied, 533 including filesystem metadata. 534 > **Note**: 535 > The directory itself is not copied, just its contents. 536 537 - If `<src>` is any other kind of file, it is copied individually along with 538 its metadata. In this case, if `<dest>` ends with a trailing slash `/`, it 539 will be considered a directory and the contents of `<src>` will be written 540 at `<dest>/base(<src>)`. 541 542 - If multiple `<src>` resources are specified, either directly or due to the 543 use of a wildcard, then `<dest>` must be a directory, and it must end with 544 a slash `/`. 545 546 - If `<dest>` does not end with a trailing slash, it will be considered a 547 regular file and the contents of `<src>` will be written at `<dest>`. 548 549 - If `<dest>` doesn't exist, it is created along with all missing directories 550 in its path. 551 552 ## ENTRYPOINT 553 554 ENTRYPOINT has two forms: 555 556 - `ENTRYPOINT ["executable", "param1", "param2"]` 557 (the preferred *exec* form) 558 - `ENTRYPOINT command param1 param2` 559 (*shell* form) 560 561 An `ENTRYPOINT` allows you to configure a container that will run as an executable. 562 563 For example, the following will start nginx with its default content, listening 564 on port 80: 565 566 docker run -i -t --rm -p 80:80 nginx 567 568 Command line arguments to `docker run <image>` will be appended after all 569 elements in an *exec* form `ENTRYPOINT`, and will override all elements specified 570 using `CMD`. 571 This allows arguments to be passed to the entry point, i.e., `docker run <image> -d` 572 will pass the `-d` argument to the entry point. 573 You can override the `ENTRYPOINT` instruction using the `docker run --entrypoint` 574 flag. 575 576 The *shell* form prevents any `CMD` or `run` command line arguments from being 577 used, but has the disadvantage that your `ENTRYPOINT` will be started as a 578 subcommand of `/bin/sh -c`, which does not pass signals. 579 This means that the executable will not be the container's `PID 1` - and 580 will _not_ receive Unix signals - so your executable will not receive a 581 `SIGTERM` from `docker stop <container>`. 582 583 Only the last `ENTRYPOINT` instruction in the `Dockerfile` will have an effect. 584 585 ### Exec form ENTRYPOINT example 586 587 You can use the *exec* form of `ENTRYPOINT` to set fairly stable default commands 588 and arguments and then use either form of `CMD` to set additional defaults that 589 are more likely to be changed. 590 591 FROM ubuntu 592 ENTRYPOINT ["top", "-b"] 593 CMD ["-c"] 594 595 When you run the container, you can see that `top` is the only process: 596 597 $ docker run -it --rm --name test top -H 598 top - 08:25:00 up 7:27, 0 users, load average: 0.00, 0.01, 0.05 599 Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie 600 %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 601 KiB Mem: 2056668 total, 1616832 used, 439836 free, 99352 buffers 602 KiB Swap: 1441840 total, 0 used, 1441840 free. 1324440 cached Mem 603 604 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 605 1 root 20 0 19744 2336 2080 R 0.0 0.1 0:00.04 top 606 607 To examine the result further, you can use `docker exec`: 608 609 $ docker exec -it test ps aux 610 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 611 root 1 2.6 0.1 19752 2352 ? Ss+ 08:24 0:00 top -b -H 612 root 7 0.0 0.1 15572 2164 ? R+ 08:25 0:00 ps aux 613 614 And you can gracefully request `top` to shut down using `docker stop test`. 615 616 The following `Dockerfile` shows using the `ENTRYPOINT` to run Apache in the 617 foreground (i.e., as `PID 1`): 618 619 ``` 620 FROM debian:stable 621 RUN apt-get update && apt-get install -y --force-yes apache2 622 EXPOSE 80 443 623 VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] 624 ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] 625 ``` 626 627 If you need to write a starter script for a single executable, you can ensure that 628 the final executable receives the Unix signals by using `exec` and `gosu` 629 (see [the Dockerfile best practices](/articles/dockerfile_best-practices/#entrypoint) 630 for more details): 631 632 ```bash 633 #!/bin/bash 634 set -e 635 636 if [ "$1" = 'postgres' ]; then 637 chown -R postgres "$PGDATA" 638 639 if [ -z "$(ls -A "$PGDATA")" ]; then 640 gosu postgres initdb 641 fi 642 643 exec gosu postgres "$@" 644 fi 645 646 exec "$@" 647 ``` 648 649 Lastly, if you need to do some extra cleanup (or communicate with other containers) 650 on shutdown, or are co-ordinating more than one executable, you may need to ensure 651 that the `ENTRYPOINT` script receives the Unix signals, passes them on, and then 652 does some more work: 653 654 ``` 655 #!/bin/sh 656 # Note: I've written this using sh so it works in the busybox container too 657 658 # USE the trap if you need to also do manual cleanup after the service is stopped, 659 # or need to start multiple services in the one container 660 trap "echo TRAPed signal" HUP INT QUIT KILL TERM 661 662 # start service in background here 663 /usr/sbin/apachectl start 664 665 echo "[hit enter key to exit] or run 'docker stop <container>'" 666 read 667 668 # stop service and clean up here 669 echo "stopping apache" 670 /usr/sbin/apachectl stop 671 672 echo "exited $0" 673 ``` 674 675 If you run this image with `docker run -it --rm -p 80:80 --name test apache`, 676 you can then examine the container's processes with `docker exec`, or `docker top`, 677 and then ask the script to stop Apache: 678 679 ```bash 680 $ docker exec -it test ps aux 681 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 682 root 1 0.1 0.0 4448 692 ? Ss+ 00:42 0:00 /bin/sh /run.sh 123 cmd cmd2 683 root 19 0.0 0.2 71304 4440 ? Ss 00:42 0:00 /usr/sbin/apache2 -k start 684 www-data 20 0.2 0.2 360468 6004 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start 685 www-data 21 0.2 0.2 360468 6000 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start 686 root 81 0.0 0.1 15572 2140 ? R+ 00:44 0:00 ps aux 687 $ docker top test 688 PID USER COMMAND 689 10035 root {run.sh} /bin/sh /run.sh 123 cmd cmd2 690 10054 root /usr/sbin/apache2 -k start 691 10055 33 /usr/sbin/apache2 -k start 692 10056 33 /usr/sbin/apache2 -k start 693 $ /usr/bin/time docker stop test 694 test 695 real 0m 0.27s 696 user 0m 0.03s 697 sys 0m 0.03s 698 ``` 699 700 > **Note:** you can over ride the `ENTRYPOINT` setting using `--entrypoint`, 701 > but this can only set the binary to *exec* (no `sh -c` will be used). 702 703 > **Note**: 704 > The *exec* form is parsed as a JSON array, which means that 705 > you must use double-quotes (") around words not single-quotes ('). 706 707 > **Note**: 708 > Unlike the *shell* form, the *exec* form does not invoke a command shell. 709 > This means that normal shell processing does not happen. For example, 710 > `ENTRYPOINT [ "echo", "$HOME" ]` will not do variable substitution on `$HOME`. 711 > If you want shell processing then either use the *shell* form or execute 712 > a shell directly, for example: `ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ]`. 713 > Variables that are defined in the `Dockerfile`using `ENV`, will be substituted by 714 > the `Dockerfile` parser. 715 716 ### Shell form ENTRYPOINT example 717 718 You can specify a plain string for the `ENTRYPOINT` and it will execute in `/bin/sh -c`. 719 This form will use shell processing to substitute shell environment variables, 720 and will ignore any `CMD` or `docker run` command line arguments. 721 To ensure that `docker stop` will signal any long running `ENTRYPOINT` executable 722 correctly, you need to remember to start it with `exec`: 723 724 FROM ubuntu 725 ENTRYPOINT exec top -b 726 727 When you run this image, you'll see the single `PID 1` process: 728 729 $ docker run -it --rm --name test top 730 Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached 731 CPU: 5% usr 0% sys 0% nic 94% idle 0% io 0% irq 0% sirq 732 Load average: 0.08 0.03 0.05 2/98 6 733 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 734 1 0 root R 3164 0% 0% top -b 735 736 Which will exit cleanly on `docker stop`: 737 738 $ /usr/bin/time docker stop test 739 test 740 real 0m 0.20s 741 user 0m 0.02s 742 sys 0m 0.04s 743 744 If you forget to add `exec` to the beginning of your `ENTRYPOINT`: 745 746 FROM ubuntu 747 ENTRYPOINT top -b 748 CMD --ignored-param1 749 750 You can then run it (giving it a name for the next step): 751 752 $ docker run -it --name test top --ignored-param2 753 Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached 754 CPU: 9% usr 2% sys 0% nic 88% idle 0% io 0% irq 0% sirq 755 Load average: 0.01 0.02 0.05 2/101 7 756 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 757 1 0 root S 3168 0% 0% /bin/sh -c top -b cmd cmd2 758 7 1 root R 3164 0% 0% top -b 759 760 You can see from the output of `top` that the specified `ENTRYPOINT` is not `PID 1`. 761 762 If you then run `docker stop test`, the container will not exit cleanly - the 763 `stop` command will be forced to send a `SIGKILL` after the timeout: 764 765 $ docker exec -it test ps aux 766 PID USER COMMAND 767 1 root /bin/sh -c top -b cmd cmd2 768 7 root top -b 769 8 root ps aux 770 $ /usr/bin/time docker stop test 771 test 772 real 0m 10.19s 773 user 0m 0.04s 774 sys 0m 0.03s 775 776 ## VOLUME 777 778 VOLUME ["/data"] 779 780 The `VOLUME` instruction will create a mount point with the specified name 781 and mark it as holding externally mounted volumes from native host or other 782 containers. The value can be a JSON array, `VOLUME ["/var/log/"]`, or a plain 783 string with multiple arguments, such as `VOLUME /var/log` or `VOLUME /var/log 784 /var/db`. For more information/examples and mounting instructions via the 785 Docker client, refer to [*Share Directories via Volumes*](/userguide/dockervolumes/#volume) 786 documentation. 787 788 > **Note**: 789 > The list is parsed as a JSON array, which means that 790 > you must use double-quotes (") around words not single-quotes ('). 791 792 ## USER 793 794 USER daemon 795 796 The `USER` instruction sets the user name or UID to use when running the image 797 and for any `RUN`, `CMD` and `ENTRYPOINT` instructions that follow it in the 798 `Dockerfile`. 799 800 ## WORKDIR 801 802 WORKDIR /path/to/workdir 803 804 The `WORKDIR` instruction sets the working directory for any `RUN`, `CMD`, 805 `ENTRYPOINT`, `COPY` and `ADD` instructions that follow it in the `Dockerfile`. 806 807 It can be used multiple times in the one `Dockerfile`. If a relative path 808 is provided, it will be relative to the path of the previous `WORKDIR` 809 instruction. For example: 810 811 WORKDIR /a 812 WORKDIR b 813 WORKDIR c 814 RUN pwd 815 816 The output of the final `pwd` command in this `Dockerfile` would be 817 `/a/b/c`. 818 819 The `WORKDIR` instruction can resolve environment variables previously set using 820 `ENV`. You can only use environment variables explicitly set in the `Dockerfile`. 821 For example: 822 823 ENV DIRPATH /path 824 WORKDIR $DIRPATH/$DIRNAME 825 826 The output of the final `pwd` command in this `Dockerfile` would be 827 `/path/$DIRNAME` 828 829 ## ONBUILD 830 831 ONBUILD [INSTRUCTION] 832 833 The `ONBUILD` instruction adds to the image a *trigger* instruction to 834 be executed at a later time, when the image is used as the base for 835 another build. The trigger will be executed in the context of the 836 downstream build, as if it had been inserted immediately after the 837 `FROM` instruction in the downstream `Dockerfile`. 838 839 Any build instruction can be registered as a trigger. 840 841 This is useful if you are building an image which will be used as a base 842 to build other images, for example an application build environment or a 843 daemon which may be customized with user-specific configuration. 844 845 For example, if your image is a reusable Python application builder, it 846 will require application source code to be added in a particular 847 directory, and it might require a build script to be called *after* 848 that. You can't just call `ADD` and `RUN` now, because you don't yet 849 have access to the application source code, and it will be different for 850 each application build. You could simply provide application developers 851 with a boilerplate `Dockerfile` to copy-paste into their application, but 852 that is inefficient, error-prone and difficult to update because it 853 mixes with application-specific code. 854 855 The solution is to use `ONBUILD` to register advance instructions to 856 run later, during the next build stage. 857 858 Here's how it works: 859 860 1. When it encounters an `ONBUILD` instruction, the builder adds a 861 trigger to the metadata of the image being built. The instruction 862 does not otherwise affect the current build. 863 2. At the end of the build, a list of all triggers is stored in the 864 image manifest, under the key `OnBuild`. They can be inspected with 865 the `docker inspect` command. 866 3. Later the image may be used as a base for a new build, using the 867 `FROM` instruction. As part of processing the `FROM` instruction, 868 the downstream builder looks for `ONBUILD` triggers, and executes 869 them in the same order they were registered. If any of the triggers 870 fail, the `FROM` instruction is aborted which in turn causes the 871 build to fail. If all triggers succeed, the `FROM` instruction 872 completes and the build continues as usual. 873 4. Triggers are cleared from the final image after being executed. In 874 other words they are not inherited by "grand-children" builds. 875 876 For example you might add something like this: 877 878 [...] 879 ONBUILD ADD . /app/src 880 ONBUILD RUN /usr/local/bin/python-build --dir /app/src 881 [...] 882 883 > **Warning**: Chaining `ONBUILD` instructions using `ONBUILD ONBUILD` isn't allowed. 884 885 > **Warning**: The `ONBUILD` instruction may not trigger `FROM` or `MAINTAINER` instructions. 886 887 ## Dockerfile Examples 888 889 # Nginx 890 # 891 # VERSION 0.0.1 892 893 FROM ubuntu 894 MAINTAINER Victor Vieux <victor@docker.com> 895 896 RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server 897 898 # Firefox over VNC 899 # 900 # VERSION 0.3 901 902 FROM ubuntu 903 904 # Install vnc, xvfb in order to create a 'fake' display and firefox 905 RUN apt-get update && apt-get install -y x11vnc xvfb firefox 906 RUN mkdir ~/.vnc 907 # Setup a password 908 RUN x11vnc -storepasswd 1234 ~/.vnc/passwd 909 # Autostart firefox (might not be the best way, but it does the trick) 910 RUN bash -c 'echo "firefox" >> /.bashrc' 911 912 EXPOSE 5900 913 CMD ["x11vnc", "-forever", "-usepw", "-create"] 914 915 # Multiple images example 916 # 917 # VERSION 0.1 918 919 FROM ubuntu 920 RUN echo foo > bar 921 # Will output something like ===> 907ad6c2736f 922 923 FROM ubuntu 924 RUN echo moo > oink 925 # Will output something like ===> 695d7793cbe4 926 927 # You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with 928 # /oink. 929