builder: rephrase ENV section, remove examples for ENV key value without '='

The `ENV key value` form can be ambiguous, for example, the following defines
a single env-variable (`ONE`) with value `"TWO= THREE=world"`:

    ENV ONE TWO= THREE=world

While we cannot deprecate/remove that syntax (as it would break existing
Dockerfiles), we should reduce exposure of the format in our examples.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2020-09-23 12:42:17 +02:00
parent e4b7edde09
commit 0a0037c6fd
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
8 changed files with 47 additions and 44 deletions

View File

@ -500,10 +500,10 @@ Example (parsed representation is displayed after the `#`):
```dockerfile ```dockerfile
FROM busybox FROM busybox
ENV foo /bar ENV FOO=/bar
WORKDIR ${foo} # WORKDIR /bar WORKDIR ${FOO} # WORKDIR /bar
ADD . $foo # ADD . /bar ADD . $FOO # ADD . /bar
COPY \$foo /quux # COPY $foo /quux COPY \$FOO /quux # COPY $FOO /quux
``` ```
Environment variables are supported by the following list of instructions in Environment variables are supported by the following list of instructions in
@ -994,53 +994,56 @@ port. For detailed information, see the
## ENV ## ENV
```dockerfile ```dockerfile
ENV <key> <value>
ENV <key>=<value> ... ENV <key>=<value> ...
``` ```
The `ENV` instruction sets the environment variable `<key>` to the value The `ENV` instruction sets the environment variable `<key>` to the value
`<value>`. This value will be in the environment for all subsequent instructions `<value>`. This value will be in the environment for all subsequent instructions
in the build stage and can be [replaced inline](#environment-replacement) in in the build stage and can be [replaced inline](#environment-replacement) in
many as well. many as well. The value will be interpreted for other environment variables, so
quote characters will be removed if they are not escaped. Like command line parsing,
The `ENV` instruction has two forms. The first form, `ENV <key> <value>`,
will set a single variable to a value. The entire string after the first
space will be treated as the `<value>` - including whitespace characters. The
value will be interpreted for other environment variables, so quote characters
will be removed if they are not escaped.
The second form, `ENV <key>=<value> ...`, allows for multiple variables to
be set at one time. Notice that the second form uses the equals sign (=)
in the syntax, while the first form does not. Like command line parsing,
quotes and backslashes can be used to include spaces within values. quotes and backslashes can be used to include spaces within values.
For example: Example:
```dockerfile ```dockerfile
ENV myName="John Doe" myDog=Rex\ The\ Dog \ ENV MY_NAME="John Doe"
myCat=fluffy ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
``` ```
and The `ENV` instruction allows for multiple `<key>=<value> ...` variables to be set
at one time, and the example below will yield the same net results in the final
image:
```dockerfile ```dockerfile
ENV myName John Doe ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
ENV myDog Rex The Dog MY_CAT=fluffy
ENV myCat fluffy
``` ```
will yield the same net results in the final image.
The environment variables set using `ENV` will persist when a container is run 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 from the resulting image. You can view the values using `docker inspect`, and
change them using `docker run --env <key>=<value>`. change them using `docker run --env <key>=<value>`.
> **Note** > **Note**
> >
> Environment persistence can cause unexpected side effects. For example, > Environment variable persistence can cause unexpected side effects. For example,
> setting `ENV DEBIAN_FRONTEND noninteractive` may confuse apt-get > setting `ENV DEBIAN_FRONTEND=noninteractive` changes the behavior of `apt-get`,
> users on a Debian-based image. To set a value for a single command, use > and may confuse users of your image.
> `RUN <key>=<value> <command>`. >
> If an environment variable is only needed during build, and not in the final
> image, consider setting a value for a single command instead:
>
> ```dockerfile
> RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
> ```
>
> Or using [`ARG`](#arg), which is not persisted in the final image:
>
> ```dockerfile
> ARG DEBIAN_FRONTEND=noninteractive
> RUN apt-get update && apt-get install -y ...
> ```
## ADD ## ADD
@ -1768,7 +1771,7 @@ The `WORKDIR` instruction can resolve environment variables previously set using
For example: For example:
```dockerfile ```dockerfile
ENV DIRPATH /path ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME WORKDIR $DIRPATH/$DIRNAME
RUN pwd RUN pwd
``` ```
@ -1873,7 +1876,7 @@ this Dockerfile with an `ENV` and `ARG` instruction.
```dockerfile ```dockerfile
FROM ubuntu FROM ubuntu
ARG CONT_IMG_VER ARG CONT_IMG_VER
ENV CONT_IMG_VER v1.0.0 ENV CONT_IMG_VER=v1.0.0
RUN echo $CONT_IMG_VER RUN echo $CONT_IMG_VER
``` ```
@ -1894,7 +1897,7 @@ useful interactions between `ARG` and `ENV` instructions:
```dockerfile ```dockerfile
FROM ubuntu FROM ubuntu
ARG CONT_IMG_VER ARG CONT_IMG_VER
ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0} ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER RUN echo $CONT_IMG_VER
``` ```
@ -2030,7 +2033,7 @@ Consider another example under the same command line:
```dockerfile ```dockerfile
FROM ubuntu FROM ubuntu
ARG CONT_IMG_VER ARG CONT_IMG_VER
ENV CONT_IMG_VER $CONT_IMG_VER ENV CONT_IMG_VER=$CONT_IMG_VER
RUN echo $CONT_IMG_VER RUN echo $CONT_IMG_VER
``` ```
@ -2045,7 +2048,7 @@ this Dockerfile:
```dockerfile ```dockerfile
FROM ubuntu FROM ubuntu
ARG CONT_IMG_VER ARG CONT_IMG_VER
ENV CONT_IMG_VER hello ENV CONT_IMG_VER=hello
RUN echo $CONT_IMG_VER RUN echo $CONT_IMG_VER
``` ```

View File

@ -742,7 +742,7 @@ FROM busybox
RUN echo hello > /hello RUN echo hello > /hello
RUN echo world >> /hello RUN echo world >> /hello
RUN touch remove_me /remove_me RUN touch remove_me /remove_me
ENV HELLO world ENV HELLO=world
RUN rm /remove_me RUN rm /remove_me
``` ```

View File

@ -73,7 +73,7 @@ $ docker inspect -f "{{ .Config.Env }}" c3f279d17e0a
[HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin] [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
$ docker commit --change "ENV DEBUG true" c3f279d17e0a svendowideit/testimage:version3 $ docker commit --change "ENV DEBUG=true" c3f279d17e0a svendowideit/testimage:version3
f5283438590d f5283438590d

View File

@ -72,7 +72,7 @@ $ sudo tar -c . | docker import - exampleimagedir
### Import from a local directory with new configurations ### Import from a local directory with new configurations
```bash ```bash
$ sudo tar -c . | docker import --change "ENV DEBUG true" - exampleimagedir $ sudo tar -c . | docker import --change "ENV DEBUG=true" - exampleimagedir
``` ```
Note the `sudo` in this example you must preserve Note the `sudo` in this example you must preserve

View File

@ -116,8 +116,8 @@ func TestBuildIidFileSquash(t *testing.T) {
buildDir := fs.NewDir(t, "test-iidfile-squash-build", buildDir := fs.NewDir(t, "test-iidfile-squash-build",
fs.WithFile("Dockerfile", fmt.Sprintf(` fs.WithFile("Dockerfile", fmt.Sprintf(`
FROM %s FROM %s
ENV FOO FOO ENV FOO=FOO
ENV BAR BAR ENV BAR=BAR
RUN touch /fiip RUN touch /fiip
RUN touch /foop`, fixtures.AlpineImage)), RUN touch /foop`, fixtures.AlpineImage)),
) )

View File

@ -201,7 +201,7 @@ A Dockerfile is similar to a Makefile.
from the resulting image. Use `docker inspect` to inspect these values, and from the resulting image. Use `docker inspect` to inspect these values, and
change them using `docker run --env <key>=<value>`. change them using `docker run --env <key>=<value>`.
Note that setting "`ENV DEBIAN_FRONTEND noninteractive`" may cause Note that setting "`ENV DEBIAN_FRONTEND=noninteractive`" may cause
unintended consequences, because it will persist when the container is run unintended consequences, because it will persist when the container is run
interactively, as with the following command: `docker run -t -i image bash` interactively, as with the following command: `docker run -t -i image bash`
@ -388,7 +388,7 @@ A Dockerfile is similar to a Makefile.
``` ```
1 FROM ubuntu 1 FROM ubuntu
2 ARG CONT_IMG_VER 2 ARG CONT_IMG_VER
3 ENV CONT_IMG_VER v1.0.0 3 ENV CONT_IMG_VER=v1.0.0
4 RUN echo $CONT_IMG_VER 4 RUN echo $CONT_IMG_VER
``` ```
Then, assume this image is built with this command: Then, assume this image is built with this command:
@ -408,7 +408,7 @@ A Dockerfile is similar to a Makefile.
``` ```
1 FROM ubuntu 1 FROM ubuntu
2 ARG CONT_IMG_VER 2 ARG CONT_IMG_VER
3 ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0} 3 ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
4 RUN echo $CONT_IMG_VER 4 RUN echo $CONT_IMG_VER
``` ```

View File

@ -27,4 +27,4 @@ variable set to "true", you can create a new image based on that
container by first getting the container's ID with `docker ps` and container by first getting the container's ID with `docker ps` and
then running: then running:
$ docker container commit -c="ENV DEBUG true" 98bd7fc99854 debug-image $ docker container commit -c="ENV DEBUG=true" 98bd7fc99854 debug-image

View File

@ -36,7 +36,7 @@ Import to docker via pipe and stdin:
## Apply specified Dockerfile instructions while importing the image ## Apply specified Dockerfile instructions while importing the image
This example sets the docker image ENV variable DEBUG to true by default. This example sets the docker image ENV variable DEBUG to true by default.
# tar -c . | docker image import -c="ENV DEBUG true" - exampleimagedir # tar -c . | docker image import -c="ENV DEBUG=true" - exampleimagedir
## When the daemon supports multiple operating systems ## When the daemon supports multiple operating systems
If the daemon supports multiple operating systems, and the image being imported If the daemon supports multiple operating systems, and the image being imported