2014-04-15 20:53:12 -04:00
|
|
|
|
page_title: Dockerfile Reference
|
|
|
|
|
page_description: Dockerfiles use a simple DSL which allows you to automate the steps you would normally manually take to create an image.
|
|
|
|
|
page_keywords: builder, docker, Dockerfile, automation, image creation
|
|
|
|
|
|
|
|
|
|
# Dockerfile Reference
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
**Docker can act as a builder** and read instructions from a text *Dockerfile*
|
|
|
|
|
to automate the steps you would otherwise take manually to create an image.
|
|
|
|
|
Executing `docker build` will run your steps and commit them along the way,
|
|
|
|
|
giving you a final image.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
To [*build*](../commandline/cli/#cli-build) an image from a source repository,
|
|
|
|
|
create a description file called Dockerfile at the root of your repository.
|
|
|
|
|
This file will describe the steps to assemble the image.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-06-20 17:18:37 -04:00
|
|
|
|
Then call `docker build` with the path of your source repository as the argument
|
2014-04-23 16:48:28 -04:00
|
|
|
|
(for example, `.`):
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-05-01 10:13:34 -04:00
|
|
|
|
$ sudo docker build .
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
The path to the source repository defines where to find the *context* of
|
|
|
|
|
the build. The build is run by the Docker daemon, not by the CLI, so the
|
|
|
|
|
whole context must be transferred to the daemon. The Docker CLI reports
|
2014-05-28 12:59:29 -04:00
|
|
|
|
"Sending build context to Docker daemon" when the context is sent to the daemon.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
You can specify a repository and tag at which to save the new image if
|
|
|
|
|
the build succeeds:
|
|
|
|
|
|
2014-05-01 10:13:34 -04:00
|
|
|
|
$ sudo docker build -t shykes/myapp .
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
The Docker daemon will run your steps one-by-one, committing the result
|
|
|
|
|
to a new image if necessary, before finally outputting the ID of your
|
|
|
|
|
new image. The Docker daemon will automatically clean up the context you
|
|
|
|
|
sent.
|
|
|
|
|
|
|
|
|
|
Note that each instruction is run independently, and causes a new image
|
2014-04-23 16:48:28 -04:00
|
|
|
|
to be created - so `RUN cd /tmp` will not have any effect on the next
|
|
|
|
|
instructions.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
Whenever possible, Docker will re-use the intermediate images,
|
2014-04-23 16:48:28 -04:00
|
|
|
|
accelerating `docker build` significantly (indicated by `Using cache`):
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
$ docker build -t SvenDowideit/ambassador .
|
|
|
|
|
Uploading context 10.24 kB
|
|
|
|
|
Uploading context
|
|
|
|
|
Step 1 : FROM docker-ut
|
|
|
|
|
---> cbba202fe96b
|
|
|
|
|
Step 2 : MAINTAINER SvenDowideit@home.org.au
|
|
|
|
|
---> Using cache
|
|
|
|
|
---> 51182097be13
|
|
|
|
|
Step 3 : CMD env | grep _TCP= | sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' | sh && top
|
|
|
|
|
---> Using cache
|
|
|
|
|
---> 1a5ffc17324d
|
|
|
|
|
Successfully built 1a5ffc17324d
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
When you're done with your build, you're ready to look into
|
|
|
|
|
[*Pushing a repository to its registry*](
|
2014-05-21 17:05:19 -04:00
|
|
|
|
/userguide/dockerrepos/#image-push).
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
## Format
|
|
|
|
|
|
|
|
|
|
Here is the format of the Dockerfile:
|
|
|
|
|
|
|
|
|
|
# Comment
|
|
|
|
|
INSTRUCTION arguments
|
|
|
|
|
|
|
|
|
|
The Instruction is not case-sensitive, however convention is for them to
|
|
|
|
|
be UPPERCASE in order to distinguish them from arguments more easily.
|
|
|
|
|
|
|
|
|
|
Docker evaluates the instructions in a Dockerfile in order. **The first
|
|
|
|
|
instruction must be \`FROM\`** in order to specify the [*Base
|
2014-04-24 08:12:21 -04:00
|
|
|
|
Image*](/terms/image/#base-image-def) from which you are building.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
Docker will treat lines that *begin* with `#` as a
|
|
|
|
|
comment. A `#` marker anywhere else in the line will
|
|
|
|
|
be treated as an argument. This allows statements like:
|
|
|
|
|
|
|
|
|
|
# Comment
|
|
|
|
|
RUN echo 'we are running some # of cool things'
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
Here is the set of instructions you can use in a Dockerfile
|
2014-04-15 20:53:12 -04:00
|
|
|
|
for building images.
|
|
|
|
|
|
2014-07-01 15:03:07 -04:00
|
|
|
|
## .dockerignore
|
|
|
|
|
|
|
|
|
|
If a file named `.dockerignore` exists in the source repository, then it
|
|
|
|
|
is interpreted as a newline-separated list of exclusion patterns.
|
|
|
|
|
Exclusion patterns match files or directories relative to the source repository
|
|
|
|
|
that will be excluded from the context. Globbing is done using Go's
|
|
|
|
|
[filepath.Match](http://golang.org/pkg/path/filepath#Match) rules.
|
|
|
|
|
|
|
|
|
|
The following example shows the use of the `.dockerignore` file to exclude the
|
|
|
|
|
`.git` directory from the context. Its effect can be seen in the changed size of
|
|
|
|
|
the uploaded context.
|
|
|
|
|
|
|
|
|
|
$ docker build .
|
|
|
|
|
Uploading context 18.829 MB
|
|
|
|
|
Uploading context
|
|
|
|
|
Step 0 : FROM busybox
|
|
|
|
|
---> 769b9341d937
|
|
|
|
|
Step 1 : CMD echo Hello World
|
|
|
|
|
---> Using cache
|
|
|
|
|
---> 99cc1ad10469
|
|
|
|
|
Successfully built 99cc1ad10469
|
|
|
|
|
$ echo ".git" > .dockerignore
|
|
|
|
|
$ docker build .
|
|
|
|
|
Uploading context 6.76 MB
|
|
|
|
|
Uploading context
|
|
|
|
|
Step 0 : FROM busybox
|
|
|
|
|
---> 769b9341d937
|
|
|
|
|
Step 1 : CMD echo Hello World
|
|
|
|
|
---> Using cache
|
|
|
|
|
---> 99cc1ad10469
|
|
|
|
|
Successfully built 99cc1ad10469
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## FROM
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
FROM <image>
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
Or
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
FROM <image>:<tag>
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-24 08:12:21 -04:00
|
|
|
|
The `FROM` instruction sets the [*Base Image*](/terms/image/#base-image-def)
|
2014-04-23 16:48:28 -04:00
|
|
|
|
for subsequent instructions. As such, a valid Dockerfile must have `FROM` as
|
|
|
|
|
its first instruction. The image can be any valid image – it is especially easy
|
|
|
|
|
to start by **pulling an image** from the [*Public Repositories*](
|
2014-05-21 17:05:19 -04:00
|
|
|
|
/userguide/dockerrepos/#using-public-repositories).
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
`FROM` must be the first non-comment instruction in the Dockerfile.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
`FROM` can appear multiple times within a single Dockerfile in order to create
|
|
|
|
|
multiple images. Simply make a note of the last image id output by the commit
|
|
|
|
|
before each new `FROM` command.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
If no `tag` is given to the `FROM` instruction, `latest` is assumed. If the
|
2014-04-15 20:53:12 -04:00
|
|
|
|
used tag does not exist, an error will be returned.
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## MAINTAINER
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
MAINTAINER <name>
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The `MAINTAINER` instruction allows you to set the *Author* field of the
|
|
|
|
|
generated images.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## RUN
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
RUN has 2 forms:
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- `RUN <command>` (the command is run in a shell - `/bin/sh -c`)
|
|
|
|
|
- `RUN ["executable", "param1", "param2"]` (*exec* form)
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The `RUN` instruction will execute any commands in a new layer on top of the
|
|
|
|
|
current image and commit the results. The resulting committed image will be
|
|
|
|
|
used for the next step in the Dockerfile.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
Layering `RUN` instructions and generating commits conforms to the core
|
|
|
|
|
concepts of Docker where commits are cheap and containers can be created from
|
|
|
|
|
any point in an image's history, much like source control.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The *exec* form makes it possible to avoid shell string munging, and to `RUN`
|
|
|
|
|
commands using a base image that does not contain `/bin/sh`.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-05-15 04:56:23 -04:00
|
|
|
|
The cache for `RUN` instructions isn't invalidated automatically during the
|
|
|
|
|
next build. The cache for an instruction like `RUN apt-get dist-upgrade -y`
|
|
|
|
|
will be reused during the next build.
|
|
|
|
|
The cache for `RUN` instructions can be invalidated by using the `--no-cache`
|
|
|
|
|
flag, for example `docker build --no-cache`.
|
|
|
|
|
|
|
|
|
|
The first encountered `ADD` instruction will invalidate the cache for all
|
|
|
|
|
following instructions from the 'Dockerfile' if the contents of the context
|
|
|
|
|
have changed. This will also invalidate the cache for `RUN` instructions.
|
|
|
|
|
|
2014-04-15 20:53:12 -04:00
|
|
|
|
### Known Issues (RUN)
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- [Issue 783](https://github.com/dotcloud/docker/issues/783) is about file
|
|
|
|
|
permissions problems that can occur when using the AUFS file system. You
|
|
|
|
|
might notice it during an attempt to `rm` a file, for example. The issue
|
|
|
|
|
describes a workaround.
|
|
|
|
|
- [Issue 2424](https://github.com/dotcloud/docker/issues/2424) Locale will
|
|
|
|
|
not be set automatically.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## CMD
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
CMD has three forms:
|
|
|
|
|
|
2014-06-04 03:08:44 -04:00
|
|
|
|
- `CMD ["executable","param1","param2"]` (like an *exec*, this is the preferred form)
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- `CMD ["param1","param2"]` (as *default parameters to ENTRYPOINT*)
|
|
|
|
|
- `CMD command param1 param2` (as a *shell*)
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
There can only be one CMD in a Dockerfile. If you list more than one CMD
|
|
|
|
|
then only the last CMD will take effect.
|
|
|
|
|
|
|
|
|
|
**The main purpose of a CMD is to provide defaults for an executing
|
|
|
|
|
container.** These defaults can include an executable, or they can omit
|
|
|
|
|
the executable, in which case you must specify an ENTRYPOINT as well.
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
When used in the shell or exec formats, the `CMD` instruction sets the command
|
|
|
|
|
to be executed when running the image.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
If you use the *shell* form of the CMD, then the `<command>` will execute in
|
|
|
|
|
`/bin/sh -c`:
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
|
|
|
|
CMD echo "This is a test." | wc -
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
If you want to **run your** `<command>` **without a shell** then you must
|
|
|
|
|
express the command as a JSON array and give the full path to the executable.
|
|
|
|
|
**This array form is the preferred format of CMD.** Any additional parameters
|
|
|
|
|
must be individually expressed as strings in the array:
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
|
|
|
|
CMD ["/usr/bin/wc","--help"]
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
If you would like your container to run the same executable every time, then
|
|
|
|
|
you should consider using `ENTRYPOINT` in combination with `CMD`. See
|
2014-04-17 11:09:08 -04:00
|
|
|
|
[*ENTRYPOINT*](#entrypoint).
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
If the user specifies arguments to `docker run` then they will override the
|
|
|
|
|
default specified in CMD.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-18 16:21:55 -04:00
|
|
|
|
> **Note**:
|
2014-04-23 16:48:28 -04:00
|
|
|
|
> don't confuse `RUN` with `CMD`. `RUN` actually runs a command and commits
|
2014-04-18 16:21:55 -04:00
|
|
|
|
> the result; `CMD` does not execute anything at build time, but specifies
|
|
|
|
|
> the intended command for the image.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## EXPOSE
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
EXPOSE <port> [<port>...]
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The `EXPOSE` instructions informs Docker that the container will listen on the
|
|
|
|
|
specified network ports at runtime. Docker uses this information to interconnect
|
2014-05-21 17:05:19 -04:00
|
|
|
|
containers using links (see the [Docker User
|
|
|
|
|
Guide](/userguide/dockerlinks)).
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## ENV
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
ENV <key> <value>
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The `ENV` instruction sets the environment variable `<key>` to the value
|
|
|
|
|
`<value>`. This value will be passed to all future `RUN` instructions. This is
|
|
|
|
|
functionally equivalent to prefixing the command with `<key>=<value>`
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The environment variables set using `ENV` will persist when a container is run
|
|
|
|
|
from the resulting image. You can view the values using `docker inspect`, and
|
|
|
|
|
change them using `docker run --env <key>=<value>`.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-18 16:21:55 -04:00
|
|
|
|
> **Note**:
|
2014-06-13 09:53:42 -04:00
|
|
|
|
> One example where this can cause unexpected consequences, is setting
|
2014-04-23 16:48:28 -04:00
|
|
|
|
> `ENV DEBIAN_FRONTEND noninteractive`. Which will persist when the container
|
|
|
|
|
> is run interactively; for example: `docker run -t -i image bash`
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## ADD
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
ADD <src> <dest>
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The `ADD` instruction will copy new files from `<src>` and add them to the
|
|
|
|
|
container's filesystem at path `<dest>`.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
`<src>` must be the path to a file or directory relative to the source directory
|
|
|
|
|
being built (also called the *context* of the build) or a remote file URL.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
`<dest>` is the absolute path to which the source will be copied inside the
|
|
|
|
|
destination container.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-05-20 16:39:46 -04:00
|
|
|
|
All new files and directories are created with a uid and gid of 0.
|
|
|
|
|
|
|
|
|
|
In the case where `<src>` is a remote file URL, the destination will have permissions 600.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-18 16:21:55 -04:00
|
|
|
|
> **Note**:
|
2014-05-09 18:26:41 -04:00
|
|
|
|
> If you build by passing a Dockerfile through STDIN (`docker build - < somefile`),
|
|
|
|
|
> there is no build context, so the Dockerfile can only contain a URL
|
|
|
|
|
> based ADD statement.
|
|
|
|
|
|
|
|
|
|
> You can also pass a compressed archive through STDIN:
|
|
|
|
|
> (`docker build - < archive.tar.gz`), the `Dockerfile` at the root of
|
|
|
|
|
> the archive and the rest of the archive will get used at the context
|
|
|
|
|
> of the build.
|
|
|
|
|
>
|
2014-04-18 16:21:55 -04:00
|
|
|
|
> **Note**:
|
|
|
|
|
> If your URL files are protected using authentication, you will need to
|
2014-06-20 17:36:31 -04:00
|
|
|
|
> use `RUN wget` , `RUN curl`
|
|
|
|
|
> or use another tool from within the container as ADD does not support
|
2014-04-18 16:21:55 -04:00
|
|
|
|
> authentication.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
The copy obeys the following rules:
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- The `<src>` path must be inside the *context* of the build;
|
|
|
|
|
you cannot `ADD ../something /something`, because the first step of a
|
|
|
|
|
`docker build` is to send the context directory (and subdirectories) to the
|
|
|
|
|
docker daemon.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- If `<src>` is a URL and `<dest>` does not end with a trailing slash, then a
|
|
|
|
|
file is downloaded from the URL and copied to `<dest>`.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- If `<src>` is a URL and `<dest>` does end with a trailing slash, then the
|
|
|
|
|
filename is inferred from the URL and the file is downloaded to
|
|
|
|
|
`<dest>/<filename>`. For instance, `ADD http://example.com/foobar /` would
|
|
|
|
|
create the file `/foobar`. The URL must have a nontrivial path so that an
|
|
|
|
|
appropriate filename can be discovered in this case (`http://example.com`
|
|
|
|
|
will not work).
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- If `<src>` is a directory, the entire directory is copied, including
|
|
|
|
|
filesystem metadata.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- If `<src>` is a *local* tar archive in a recognized compression format
|
|
|
|
|
(identity, gzip, bzip2 or xz) then it is unpacked as a directory. Resources
|
|
|
|
|
from *remote* URLs are **not** decompressed. When a directory is copied or
|
|
|
|
|
unpacked, it has the same behavior as `tar -x`: the result is the union of:
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
1. whatever existed at the destination path and
|
|
|
|
|
2. the contents of the source tree, with conflicts resolved in favor of
|
|
|
|
|
"2." on a file-by-file basis.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- If `<src>` is any other kind of file, it is copied individually along with
|
|
|
|
|
its metadata. In this case, if `<dest>` ends with a trailing slash `/`, it
|
|
|
|
|
will be considered a directory and the contents of `<src>` will be written
|
|
|
|
|
at `<dest>/base(<src>)`.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- If `<dest>` does not end with a trailing slash, it will be considered a
|
|
|
|
|
regular file and the contents of `<src>` will be written at `<dest>`.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- If `<dest>` doesn't exist, it is created along with all missing directories
|
|
|
|
|
in its path.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-05-28 13:53:16 -04:00
|
|
|
|
## COPY
|
|
|
|
|
|
|
|
|
|
COPY <src> <dest>
|
|
|
|
|
|
|
|
|
|
The `COPY` instruction will copy new files from `<src>` and add them to the
|
|
|
|
|
container's filesystem at path `<dest>`.
|
|
|
|
|
|
|
|
|
|
`<src>` must be the path to a file or directory relative to the source directory
|
|
|
|
|
being built (also called the *context* of the build).
|
|
|
|
|
|
|
|
|
|
`<dest>` is the absolute path to which the source will be copied inside the
|
|
|
|
|
destination container.
|
|
|
|
|
|
|
|
|
|
All new files and directories are created with a uid and gid of 0.
|
|
|
|
|
|
|
|
|
|
> **Note**:
|
|
|
|
|
> If you build using STDIN (`docker build - < somefile`), there is no
|
|
|
|
|
> build context, so `COPY` can't be used.
|
|
|
|
|
|
|
|
|
|
The copy obeys the following rules:
|
|
|
|
|
|
|
|
|
|
- The `<src>` path must be inside the *context* of the build;
|
|
|
|
|
you cannot `COPY ../something /something`, because the first step of a
|
|
|
|
|
`docker build` is to send the context directory (and subdirectories) to the
|
|
|
|
|
docker daemon.
|
|
|
|
|
|
|
|
|
|
- If `<src>` is a directory, the entire directory is copied, including
|
|
|
|
|
filesystem metadata.
|
|
|
|
|
|
|
|
|
|
- If `<src>` is any other kind of file, it is copied individually along with
|
|
|
|
|
its metadata. In this case, if `<dest>` ends with a trailing slash `/`, it
|
|
|
|
|
will be considered a directory and the contents of `<src>` will be written
|
|
|
|
|
at `<dest>/base(<src>)`.
|
|
|
|
|
|
|
|
|
|
- If `<dest>` does not end with a trailing slash, it will be considered a
|
|
|
|
|
regular file and the contents of `<src>` will be written at `<dest>`.
|
|
|
|
|
|
|
|
|
|
- If `<dest>` doesn't exist, it is created along with all missing directories
|
|
|
|
|
in its path.
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## ENTRYPOINT
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
ENTRYPOINT has two forms:
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
- `ENTRYPOINT ["executable", "param1", "param2"]`
|
|
|
|
|
(like an *exec*, preferred form)
|
|
|
|
|
- `ENTRYPOINT command param1 param2`
|
|
|
|
|
(as a *shell*)
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
There can only be one `ENTRYPOINT` in a Dockerfile. If you have more than one
|
|
|
|
|
`ENTRYPOINT`, then only the last one in the Dockerfile will have an effect.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
An `ENTRYPOINT` helps you to configure a container that you can run as an
|
|
|
|
|
executable. That is, when you specify an `ENTRYPOINT`, then the whole container
|
|
|
|
|
runs as if it was just that executable.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-17 18:55:24 -04:00
|
|
|
|
The `ENTRYPOINT` instruction adds an entry command that will **not** be
|
2014-04-23 16:48:28 -04:00
|
|
|
|
overwritten when arguments are passed to `docker run`, unlike the behavior
|
|
|
|
|
of `CMD`. This allows arguments to be passed to the entrypoint. i.e.
|
|
|
|
|
`docker run <image> -d` will pass the "-d" argument to the ENTRYPOINT.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
You can specify parameters either in the ENTRYPOINT JSON array (as in
|
|
|
|
|
"like an exec" above), or by using a CMD statement. Parameters in the
|
|
|
|
|
ENTRYPOINT will not be overridden by the `docker run`
|
|
|
|
|
arguments, but parameters specified via CMD will be overridden
|
|
|
|
|
by `docker run` arguments.
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
Like a `CMD`, you can specify a plain string for the `ENTRYPOINT` and it will
|
|
|
|
|
execute in `/bin/sh -c`:
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
|
|
|
|
ENTRYPOINT wc -l -
|
|
|
|
|
|
2014-05-09 18:26:41 -04:00
|
|
|
|
For example, that Dockerfile's image will *always* take STDIN as input
|
2014-04-15 20:53:12 -04:00
|
|
|
|
("-") and print the number of lines ("-l"). If you wanted to make this
|
|
|
|
|
optional but default, you could use a CMD:
|
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
|
|
|
|
CMD ["-l", "-"]
|
|
|
|
|
ENTRYPOINT ["/usr/bin/wc"]
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## VOLUME
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
VOLUME ["/data"]
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The `VOLUME` instruction will create a mount point with the specified name
|
|
|
|
|
and mark it as holding externally mounted volumes from native host or other
|
2014-05-09 08:42:27 -04:00
|
|
|
|
containers. The value can be a JSON array, `VOLUME ["/var/log/"]`, or a plain
|
|
|
|
|
string, `VOLUME /var/log`. For more information/examples and mounting
|
|
|
|
|
instructions via the Docker client, refer to [*Share Directories via Volumes*](
|
2014-05-21 17:05:19 -04:00
|
|
|
|
/userguide/dockervolumes/#volume-def) documentation.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## USER
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
USER daemon
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-05-23 20:16:56 -04:00
|
|
|
|
The `USER` instruction sets the username or UID to use when running the image
|
|
|
|
|
and for any following `RUN` directives.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## WORKDIR
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
WORKDIR /path/to/workdir
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
The `WORKDIR` instruction sets the working directory for the `RUN`, `CMD` and
|
2014-04-15 20:53:12 -04:00
|
|
|
|
`ENTRYPOINT` Dockerfile commands that follow it.
|
|
|
|
|
|
|
|
|
|
It can be used multiple times in the one Dockerfile. If a relative path
|
2014-04-23 16:48:28 -04:00
|
|
|
|
is provided, it will be relative to the path of the previous `WORKDIR`
|
|
|
|
|
instruction. For example:
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
The output of the final `pwd` command in this
|
|
|
|
|
Dockerfile would be `/a/b/c`.
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
## ONBUILD
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
ONBUILD [INSTRUCTION]
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
The `ONBUILD` instruction adds to the image a
|
|
|
|
|
"trigger" instruction to be executed at a later time, when the image is
|
|
|
|
|
used as the base for another build. The trigger will be executed in the
|
|
|
|
|
context of the downstream build, as if it had been inserted immediately
|
|
|
|
|
after the *FROM* instruction in the downstream Dockerfile.
|
|
|
|
|
|
|
|
|
|
Any build instruction can be registered as a trigger.
|
|
|
|
|
|
|
|
|
|
This is useful if you are building an image which will be used as a base
|
|
|
|
|
to build other images, for example an application build environment or a
|
|
|
|
|
daemon which may be customized with user-specific configuration.
|
|
|
|
|
|
|
|
|
|
For example, if your image is a reusable python application builder, it
|
|
|
|
|
will require application source code to be added in a particular
|
|
|
|
|
directory, and it might require a build script to be called *after*
|
2014-04-23 16:48:28 -04:00
|
|
|
|
that. You can't just call *ADD* and *RUN* now, because you don't yet
|
2014-04-15 20:53:12 -04:00
|
|
|
|
have access to the application source code, and it will be different for
|
|
|
|
|
each application build. You could simply provide application developers
|
|
|
|
|
with a boilerplate Dockerfile to copy-paste into their application, but
|
|
|
|
|
that is inefficient, error-prone and difficult to update because it
|
|
|
|
|
mixes with application-specific code.
|
|
|
|
|
|
|
|
|
|
The solution is to use *ONBUILD* to register in advance instructions to
|
|
|
|
|
run later, during the next build stage.
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
Here's how it works:
|
|
|
|
|
|
|
|
|
|
1. When it encounters an *ONBUILD* instruction, the builder adds a
|
|
|
|
|
trigger to the metadata of the image being built. The instruction
|
|
|
|
|
does not otherwise affect the current build.
|
|
|
|
|
2. At the end of the build, a list of all triggers is stored in the
|
|
|
|
|
image manifest, under the key *OnBuild*. They can be inspected with
|
|
|
|
|
*docker inspect*.
|
|
|
|
|
3. Later the image may be used as a base for a new build, using the
|
|
|
|
|
*FROM* instruction. As part of processing the *FROM* instruction,
|
|
|
|
|
the downstream builder looks for *ONBUILD* triggers, and executes
|
|
|
|
|
them in the same order they were registered. If any of the triggers
|
|
|
|
|
fail, the *FROM* instruction is aborted which in turn causes the
|
|
|
|
|
build to fail. If all triggers succeed, the FROM instruction
|
|
|
|
|
completes and the build continues as usual.
|
|
|
|
|
4. Triggers are cleared from the final image after being executed. In
|
|
|
|
|
other words they are not inherited by "grand-children" builds.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
For example you might add something like this:
|
|
|
|
|
|
|
|
|
|
[...]
|
|
|
|
|
ONBUILD ADD . /app/src
|
|
|
|
|
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
|
|
|
|
|
[...]
|
|
|
|
|
|
2014-04-23 16:48:28 -04:00
|
|
|
|
> **Warning**: Chaining ONBUILD instructions using ONBUILD ONBUILD isn't allowed.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
2014-04-18 16:21:55 -04:00
|
|
|
|
> **Warning**: ONBUILD may not trigger FROM or MAINTAINER instructions.
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
## Dockerfile Examples
|
|
|
|
|
|
|
|
|
|
# Nginx
|
|
|
|
|
#
|
|
|
|
|
# VERSION 0.0.1
|
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
2014-06-16 09:22:15 -04:00
|
|
|
|
MAINTAINER Victor Vieux <victor@docker.com>
|
2014-04-15 20:53:12 -04:00
|
|
|
|
|
|
|
|
|
# make sure the package repository is up to date
|
|
|
|
|
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
|
|
|
|
|
RUN apt-get update
|
|
|
|
|
|
|
|
|
|
RUN apt-get install -y inotify-tools nginx apache2 openssh-server
|
|
|
|
|
|
|
|
|
|
# Firefox over VNC
|
|
|
|
|
#
|
|
|
|
|
# VERSION 0.3
|
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
|
|
|
|
# make sure the package repository is up to date
|
|
|
|
|
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
|
|
|
|
|
RUN apt-get update
|
|
|
|
|
|
|
|
|
|
# Install vnc, xvfb in order to create a 'fake' display and firefox
|
|
|
|
|
RUN apt-get install -y x11vnc xvfb firefox
|
|
|
|
|
RUN mkdir /.vnc
|
|
|
|
|
# Setup a password
|
|
|
|
|
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
|
|
|
|
|
# Autostart firefox (might not be the best way, but it does the trick)
|
|
|
|
|
RUN bash -c 'echo "firefox" >> /.bashrc'
|
|
|
|
|
|
|
|
|
|
EXPOSE 5900
|
|
|
|
|
CMD ["x11vnc", "-forever", "-usepw", "-create"]
|
|
|
|
|
|
|
|
|
|
# Multiple images example
|
|
|
|
|
#
|
|
|
|
|
# VERSION 0.1
|
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
|
|
|
|
RUN echo foo > bar
|
|
|
|
|
# Will output something like ===> 907ad6c2736f
|
|
|
|
|
|
|
|
|
|
FROM ubuntu
|
|
|
|
|
RUN echo moo > oink
|
|
|
|
|
# Will output something like ===> 695d7793cbe4
|
|
|
|
|
|
2014-04-18 20:35:45 -04:00
|
|
|
|
# You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
|
2014-04-15 20:53:12 -04:00
|
|
|
|
# /oink.
|