github.com/fcwu/docker@v1.4.2-0.20150115145920-2a69ca89f0df/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) 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 passed to all future 353 `RUN`, `ENTRYPOINT`, and `CMD` instructions. This is 354 functionally equivalent to prefixing the command with `<key>=<value>` 355 356 The `ENV` instruction has two forms. The first form, `ENV <key> <value>`, 357 will set a single variable to a value. The entire string after the first 358 space will be treated as the `<value>` - including characters such as 359 spaces and quotes. 360 361 The second form, `ENV <key>=<value> ...`, allows for multiple variables to 362 be set at one time. Notice that the second form uses the equals sign (=) 363 in the syntax, while the first form does not. Like command line parsing, 364 quotes and backslashes can be used to include spaces within values. 365 366 For example: 367 368 ENV myName="John Doe" myDog=Rex\ The\ Dog \ 369 myCat=fluffy 370 371 and 372 373 ENV myName John Doe 374 ENV myDog Rex The Dog 375 ENV myCat fluffy 376 377 will yield the same net results in the final container, but the first form 378 does it all in one layer. 379 380 The environment variables set using `ENV` will persist when a container is run 381 from the resulting image. You can view the values using `docker inspect`, and 382 change them using `docker run --env <key>=<value>`. 383 384 > **Note**: 385 > One example where this can cause unexpected consequences, is setting 386 > `ENV DEBIAN_FRONTEND noninteractive`. Which will persist when the container 387 > is run interactively; for example: `docker run -t -i image bash` 388 389 ## ADD 390 391 ADD <src>... <dest> 392 393 The `ADD` instruction copies new files, directories or remote file URLs from `<src>` 394 and adds them to the filesystem of the container at the path `<dest>`. 395 396 Multiple `<src>` resource may be specified but if they are files or 397 directories then they must be relative to the source directory that is 398 being built (the context of the build). 399 400 Each `<src>` may contain wildcards and matching will be done using Go's 401 [filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. 402 For most command line uses this should act as expected, for example: 403 404 ADD hom* /mydir/ # adds all files starting with "hom" 405 ADD hom?.txt /mydir/ # ? is replaced with any single character 406 407 The `<dest>` is an absolute path, or a path relative to `WORKDIR`, into which 408 the source will be copied inside the destination container. 409 410 ADD test aDir/ # adds "test" to `WORKDIR`/aDir/ 411 412 All new files and directories are created with a UID and GID of 0. 413 414 In the case where `<src>` is a remote file URL, the destination will 415 have permissions of 600. If the remote file being retrieved has an HTTP 416 `Last-Modified` header, the timestamp from that header will be used 417 to set the `mtime` on the destination file. Then, like any other file 418 processed during an `ADD`, `mtime` will be included in the determination 419 of whether or not the file has changed and the cache should be updated. 420 421 > **Note**: 422 > If you build by passing a `Dockerfile` through STDIN (`docker 423 > build - < somefile`), there is no build context, so the `Dockerfile` 424 > can only contain a URL based `ADD` instruction. You can also pass a 425 > compressed archive through STDIN: (`docker build - < archive.tar.gz`), 426 > the `Dockerfile` at the root of the archive and the rest of the 427 > archive will get used at the context of the build. 428 429 > **Note**: 430 > If your URL files are protected using authentication, you 431 > will need to use `RUN wget`, `RUN curl` or use another tool from 432 > within the container as the `ADD` instruction does not support 433 > authentication. 434 435 > **Note**: 436 > The first encountered `ADD` instruction will invalidate the cache for all 437 > following instructions from the Dockerfile if the contents of `<src>` have 438 > changed. This includes invalidating the cache for `RUN` instructions. 439 > See the [`Dockerfile` Best Practices 440 guide](/articles/dockerfile_best-practices/#build-cache) for more information. 441 442 443 The copy obeys the following rules: 444 445 - The `<src>` path must be inside the *context* of the build; 446 you cannot `ADD ../something /something`, because the first step of a 447 `docker build` is to send the context directory (and subdirectories) to the 448 docker daemon. 449 450 - If `<src>` is a URL and `<dest>` does not end with a trailing slash, then a 451 file is downloaded from the URL and copied to `<dest>`. 452 453 - If `<src>` is a URL and `<dest>` does end with a trailing slash, then the 454 filename is inferred from the URL and the file is downloaded to 455 `<dest>/<filename>`. For instance, `ADD http://example.com/foobar /` would 456 create the file `/foobar`. The URL must have a nontrivial path so that an 457 appropriate filename can be discovered in this case (`http://example.com` 458 will not work). 459 460 - If `<src>` is a directory, the entire contents of the directory are copied, 461 including filesystem metadata. 462 > **Note**: 463 > The directory itself is not copied, just its contents. 464 465 - If `<src>` is a *local* tar archive in a recognized compression format 466 (identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources 467 from *remote* URLs are **not** decompressed. When a directory is copied or 468 unpacked, it has the same behavior as `tar -x`: the result is the union of: 469 470 1. Whatever existed at the destination path and 471 2. The contents of the source tree, with conflicts resolved in favor 472 of "2." on a file-by-file basis. 473 474 - If `<src>` is any other kind of file, it is copied individually along with 475 its metadata. In this case, if `<dest>` ends with a trailing slash `/`, it 476 will be considered a directory and the contents of `<src>` will be written 477 at `<dest>/base(<src>)`. 478 479 - If multiple `<src>` resources are specified, either directly or due to the 480 use of a wildcard, then `<dest>` must be a directory, and it must end with 481 a slash `/`. 482 483 - If `<dest>` does not end with a trailing slash, it will be considered a 484 regular file and the contents of `<src>` will be written at `<dest>`. 485 486 - If `<dest>` doesn't exist, it is created along with all missing directories 487 in its path. 488 489 ## COPY 490 491 COPY <src>... <dest> 492 493 The `COPY` instruction copies new files or directories from `<src>` 494 and adds them to the filesystem of the container at the path `<dest>`. 495 496 Multiple `<src>` resource may be specified but they must be relative 497 to the source directory that is being built (the context of the build). 498 499 Each `<src>` may contain wildcards and matching will be done using Go's 500 [filepath.Match](http://golang.org/pkg/path/filepath#Match) rules. 501 For most command line uses this should act as expected, for example: 502 503 COPY hom* /mydir/ # adds all files starting with "hom" 504 COPY hom?.txt /mydir/ # ? is replaced with any single character 505 506 The `<dest>` is an absolute path, or a path relative to `WORKDIR`, into which 507 the source will be copied inside the destination container. 508 509 COPY test aDir/ # adds "test" to `WORKDIR`/aDir/ 510 511 All new files and directories are created with a UID and GID of 0. 512 513 > **Note**: 514 > If you build using STDIN (`docker build - < somefile`), there is no 515 > build context, so `COPY` can't be used. 516 517 The copy obeys the following rules: 518 519 - The `<src>` path must be inside the *context* of the build; 520 you cannot `COPY ../something /something`, because the first step of a 521 `docker build` is to send the context directory (and subdirectories) to the 522 docker daemon. 523 524 - If `<src>` is a directory, the entire contents of the directory are copied, 525 including filesystem metadata. 526 > **Note**: 527 > The directory itself is not copied, just its contents. 528 529 - If `<src>` is any other kind of file, it is copied individually along with 530 its metadata. In this case, if `<dest>` ends with a trailing slash `/`, it 531 will be considered a directory and the contents of `<src>` will be written 532 at `<dest>/base(<src>)`. 533 534 - If multiple `<src>` resources are specified, either directly or due to the 535 use of a wildcard, then `<dest>` must be a directory, and it must end with 536 a slash `/`. 537 538 - If `<dest>` does not end with a trailing slash, it will be considered a 539 regular file and the contents of `<src>` will be written at `<dest>`. 540 541 - If `<dest>` doesn't exist, it is created along with all missing directories 542 in its path. 543 544 ## ENTRYPOINT 545 546 ENTRYPOINT has two forms: 547 548 - `ENTRYPOINT ["executable", "param1", "param2"]` 549 (the preferred *exec* form) 550 - `ENTRYPOINT command param1 param2` 551 (*shell* form) 552 553 An `ENTRYPOINT` allows you to configure a container that will run as an executable. 554 555 For example, the following will start nginx with its default content, listening 556 on port 80: 557 558 docker run -i -t --rm -p 80:80 nginx 559 560 Command line arguments to `docker run <image>` will be appended after all 561 elements in an *exec* form `ENTRYPOINT`, and will override all elements specified 562 using `CMD`. 563 This allows arguments to be passed to the entry point, i.e., `docker run <image> -d` 564 will pass the `-d` argument to the entry point. 565 You can override the `ENTRYPOINT` instruction using the `docker run --entrypoint` 566 flag. 567 568 The *shell* form prevents any `CMD` or `run` command line arguments from being 569 used, but has the disadvantage that your `ENTRYPOINT` will be started as a 570 subcommand of `/bin/sh -c`, which does not pass signals. 571 This means that the executable will not be the container's `PID 1` - and 572 will _not_ receive Unix signals - so your executable will not receive a 573 `SIGTERM` from `docker stop <container>`. 574 575 Only the last `ENTRYPOINT` instruction in the `Dockerfile` will have an effect. 576 577 ### Exec form ENTRYPOINT example 578 579 You can use the *exec* form of `ENTRYPOINT` to set fairly stable default commands 580 and arguments and then use either form of `CMD` to set additional defaults that 581 are more likely to be changed. 582 583 FROM ubuntu 584 ENTRYPOINT ["top", "-b"] 585 CMD ["-c"] 586 587 When you run the container, you can see that `top` is the only process: 588 589 $ docker run -it --rm --name test top -H 590 top - 08:25:00 up 7:27, 0 users, load average: 0.00, 0.01, 0.05 591 Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie 592 %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 593 KiB Mem: 2056668 total, 1616832 used, 439836 free, 99352 buffers 594 KiB Swap: 1441840 total, 0 used, 1441840 free. 1324440 cached Mem 595 596 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 597 1 root 20 0 19744 2336 2080 R 0.0 0.1 0:00.04 top 598 599 To examine the result further, you can use `docker exec`: 600 601 $ docker exec -it test ps aux 602 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 603 root 1 2.6 0.1 19752 2352 ? Ss+ 08:24 0:00 top -b -H 604 root 7 0.0 0.1 15572 2164 ? R+ 08:25 0:00 ps aux 605 606 And you can gracefully request `top` to shut down using `docker stop test`. 607 608 The following `Dockerfile` shows using the `ENTRYPOINT` to run Apache in the 609 foreground (i.e., as `PID 1`): 610 611 ``` 612 FROM debian:stable 613 RUN apt-get update && apt-get install -y --force-yes apache2 614 EXPOSE 80 443 615 VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"] 616 ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] 617 ``` 618 619 If you need to write a starter script for a single executable, you can ensure that 620 the final executable receives the Unix signals by using `exec` and `gosu` 621 (see [the Dockerfile best practices](/articles/dockerfile_best-practices/#entrypoint) 622 for more details): 623 624 ```bash 625 #!/bin/bash 626 set -e 627 628 if [ "$1" = 'postgres' ]; then 629 chown -R postgres "$PGDATA" 630 631 if [ -z "$(ls -A "$PGDATA")" ]; then 632 gosu postgres initdb 633 fi 634 635 exec gosu postgres "$@" 636 fi 637 638 exec "$@" 639 ``` 640 641 Lastly, if you need to do some extra cleanup (or communicate with other containers) 642 on shutdown, or are co-ordinating more than one executable, you may need to ensure 643 that the `ENTRYPOINT` script receives the Unix signals, passes them on, and then 644 does some more work: 645 646 ``` 647 #!/bin/sh 648 # Note: I've written this using sh so it works in the busybox container too 649 650 # USE the trap if you need to also do manual cleanup after the service is stopped, 651 # or need to start multiple services in the one container 652 trap "echo TRAPed signal" HUP INT QUIT KILL TERM 653 654 # start service in background here 655 /usr/sbin/apachectl start 656 657 echo "[hit enter key to exit] or run 'docker stop <container>'" 658 read 659 660 # stop service and clean up here 661 echo "stopping apache" 662 /usr/sbin/apachectl stop 663 664 echo "exited $0" 665 ``` 666 667 If you run this image with `docker run -it --rm -p 80:80 --name test apache`, 668 you can then examine the container's processes with `docker exec`, or `docker top`, 669 and then ask the script to stop Apache: 670 671 ```bash 672 $ docker exec -it test ps aux 673 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 674 root 1 0.1 0.0 4448 692 ? Ss+ 00:42 0:00 /bin/sh /run.sh 123 cmd cmd2 675 root 19 0.0 0.2 71304 4440 ? Ss 00:42 0:00 /usr/sbin/apache2 -k start 676 www-data 20 0.2 0.2 360468 6004 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start 677 www-data 21 0.2 0.2 360468 6000 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start 678 root 81 0.0 0.1 15572 2140 ? R+ 00:44 0:00 ps aux 679 $ docker top test 680 PID USER COMMAND 681 10035 root {run.sh} /bin/sh /run.sh 123 cmd cmd2 682 10054 root /usr/sbin/apache2 -k start 683 10055 33 /usr/sbin/apache2 -k start 684 10056 33 /usr/sbin/apache2 -k start 685 $ /usr/bin/time docker stop test 686 test 687 real 0m 0.27s 688 user 0m 0.03s 689 sys 0m 0.03s 690 ``` 691 692 > **Note:** you can over ride the `ENTRYPOINT` setting using `--entrypoint`, 693 > but this can only set the binary to *exec* (no `sh -c` will be used). 694 695 > **Note**: 696 > The *exec* form is parsed as a JSON array, which means that 697 > you must use double-quotes (") around words not single-quotes ('). 698 699 > **Note**: 700 > Unlike the *shell* form, the *exec* form does not invoke a command shell. 701 > This means that normal shell processing does not happen. For example, 702 > `ENTRYPOINT [ "echo", "$HOME" ]` will not do variable substitution on `$HOME`. 703 > If you want shell processing then either use the *shell* form or execute 704 > a shell directly, for example: `ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ]`. 705 > Variables that are defined in the `Dockerfile`using `ENV`, will be substituted by 706 > the `Dockerfile` parser. 707 708 ### Shell form ENTRYPOINT example 709 710 You can specify a plain string for the `ENTRYPOINT` and it will execute in `/bin/sh -c`. 711 This form will use shell processing to substitute shell environment variables, 712 and will ignore any `CMD` or `docker run` command line arguments. 713 To ensure that `docker stop` will signal any long running `ENTRYPOINT` executable 714 correctly, you need to remember to start it with `exec`: 715 716 FROM ubuntu 717 ENTRYPOINT exec top -b 718 719 When you run this image, you'll see the single `PID 1` process: 720 721 $ docker run -it --rm --name test top 722 Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached 723 CPU: 5% usr 0% sys 0% nic 94% idle 0% io 0% irq 0% sirq 724 Load average: 0.08 0.03 0.05 2/98 6 725 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 726 1 0 root R 3164 0% 0% top -b 727 728 Which will exit cleanly on `docker stop`: 729 730 $ /usr/bin/time docker stop test 731 test 732 real 0m 0.20s 733 user 0m 0.02s 734 sys 0m 0.04s 735 736 If you forget to add `exec` to the beginning of your `ENTRYPOINT`: 737 738 FROM ubuntu 739 ENTRYPOINT top -b 740 CMD --ignored-param1 741 742 You can then run it (giving it a name for the next step): 743 744 $ docker run -it --name test top --ignored-param2 745 Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached 746 CPU: 9% usr 2% sys 0% nic 88% idle 0% io 0% irq 0% sirq 747 Load average: 0.01 0.02 0.05 2/101 7 748 PID PPID USER STAT VSZ %VSZ %CPU COMMAND 749 1 0 root S 3168 0% 0% /bin/sh -c top -b cmd cmd2 750 7 1 root R 3164 0% 0% top -b 751 752 You can see from the output of `top` that the specified `ENTRYPOINT` is not `PID 1`. 753 754 If you then run `docker stop test`, the container will not exit cleanly - the 755 `stop` command will be forced to send a `SIGKILL` after the timeout: 756 757 $ docker exec -it test ps aux 758 PID USER COMMAND 759 1 root /bin/sh -c top -b cmd cmd2 760 7 root top -b 761 8 root ps aux 762 $ /usr/bin/time docker stop test 763 test 764 real 0m 10.19s 765 user 0m 0.04s 766 sys 0m 0.03s 767 768 ## VOLUME 769 770 VOLUME ["/data"] 771 772 The `VOLUME` instruction will create a mount point with the specified name 773 and mark it as holding externally mounted volumes from native host or other 774 containers. The value can be a JSON array, `VOLUME ["/var/log/"]`, or a plain 775 string with multiple arguments, such as `VOLUME /var/log` or `VOLUME /var/log 776 /var/db`. For more information/examples and mounting instructions via the 777 Docker client, refer to [*Share Directories via Volumes*](/userguide/dockervolumes/#volume) 778 documentation. 779 780 > **Note**: 781 > The list is parsed as a JSON array, which means that 782 > you must use double-quotes (") around words not single-quotes ('). 783 784 ## USER 785 786 USER daemon 787 788 The `USER` instruction sets the user name or UID to use when running the image 789 and for any `RUN`, `CMD` and `ENTRYPOINT` instructions that follow it in the 790 `Dockerfile`. 791 792 ## WORKDIR 793 794 WORKDIR /path/to/workdir 795 796 The `WORKDIR` instruction sets the working directory for any `RUN`, `CMD` and 797 `ENTRYPOINT` instructions that follow it in the `Dockerfile`. 798 799 It can be used multiple times in the one `Dockerfile`. If a relative path 800 is provided, it will be relative to the path of the previous `WORKDIR` 801 instruction. For example: 802 803 WORKDIR /a 804 WORKDIR b 805 WORKDIR c 806 RUN pwd 807 808 The output of the final `pwd` command in this `Dockerfile` would be 809 `/a/b/c`. 810 811 The `WORKDIR` instruction can resolve environment variables previously set using 812 `ENV`. You can only use environment variables explicitly set in the `Dockerfile`. 813 For example: 814 815 ENV DIRPATH /path 816 WORKDIR $DIRPATH/$DIRNAME 817 818 The output of the final `pwd` command in this `Dockerfile` would be 819 `/path/$DIRNAME` 820 821 ## ONBUILD 822 823 ONBUILD [INSTRUCTION] 824 825 The `ONBUILD` instruction adds to the image a *trigger* instruction to 826 be executed at a later time, when the image is used as the base for 827 another build. The trigger will be executed in the context of the 828 downstream build, as if it had been inserted immediately after the 829 `FROM` instruction in the downstream `Dockerfile`. 830 831 Any build instruction can be registered as a trigger. 832 833 This is useful if you are building an image which will be used as a base 834 to build other images, for example an application build environment or a 835 daemon which may be customized with user-specific configuration. 836 837 For example, if your image is a reusable Python application builder, it 838 will require application source code to be added in a particular 839 directory, and it might require a build script to be called *after* 840 that. You can't just call `ADD` and `RUN` now, because you don't yet 841 have access to the application source code, and it will be different for 842 each application build. You could simply provide application developers 843 with a boilerplate `Dockerfile` to copy-paste into their application, but 844 that is inefficient, error-prone and difficult to update because it 845 mixes with application-specific code. 846 847 The solution is to use `ONBUILD` to register advance instructions to 848 run later, during the next build stage. 849 850 Here's how it works: 851 852 1. When it encounters an `ONBUILD` instruction, the builder adds a 853 trigger to the metadata of the image being built. The instruction 854 does not otherwise affect the current build. 855 2. At the end of the build, a list of all triggers is stored in the 856 image manifest, under the key `OnBuild`. They can be inspected with 857 the `docker inspect` command. 858 3. Later the image may be used as a base for a new build, using the 859 `FROM` instruction. As part of processing the `FROM` instruction, 860 the downstream builder looks for `ONBUILD` triggers, and executes 861 them in the same order they were registered. If any of the triggers 862 fail, the `FROM` instruction is aborted which in turn causes the 863 build to fail. If all triggers succeed, the `FROM` instruction 864 completes and the build continues as usual. 865 4. Triggers are cleared from the final image after being executed. In 866 other words they are not inherited by "grand-children" builds. 867 868 For example you might add something like this: 869 870 [...] 871 ONBUILD ADD . /app/src 872 ONBUILD RUN /usr/local/bin/python-build --dir /app/src 873 [...] 874 875 > **Warning**: Chaining `ONBUILD` instructions using `ONBUILD ONBUILD` isn't allowed. 876 877 > **Warning**: The `ONBUILD` instruction may not trigger `FROM` or `MAINTAINER` instructions. 878 879 ## Dockerfile Examples 880 881 # Nginx 882 # 883 # VERSION 0.0.1 884 885 FROM ubuntu 886 MAINTAINER Victor Vieux <victor@docker.com> 887 888 RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server 889 890 # Firefox over VNC 891 # 892 # VERSION 0.3 893 894 FROM ubuntu 895 896 # Install vnc, xvfb in order to create a 'fake' display and firefox 897 RUN apt-get update && apt-get install -y x11vnc xvfb firefox 898 RUN mkdir ~/.vnc 899 # Setup a password 900 RUN x11vnc -storepasswd 1234 ~/.vnc/passwd 901 # Autostart firefox (might not be the best way, but it does the trick) 902 RUN bash -c 'echo "firefox" >> /.bashrc' 903 904 EXPOSE 5900 905 CMD ["x11vnc", "-forever", "-usepw", "-create"] 906 907 # Multiple images example 908 # 909 # VERSION 0.1 910 911 FROM ubuntu 912 RUN echo foo > bar 913 # Will output something like ===> 907ad6c2736f 914 915 FROM ubuntu 916 RUN echo moo > oink 917 # Will output something like ===> 695d7793cbe4 918 919 # You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with 920 # /oink. 921