LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""
```
An image can have more than one label. Prior to Docker 1.10, it was recommended
to combine all labels into a single `LABEL` instruction, to prevent extra layers
from being created. This is no longer necessary, but combining labels is still
supported. For example:
```dockerfile
# Set multiple labels on one line
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"
```
The above example can also be written as:
```dockerfile
# Set multiple labels at once, using line-continuation characters to break long lines
LABEL vendor=ACME\ Incorporated \
com.example.is-beta= \
com.example.is-production="" \
com.example.version="0.0.1-beta" \
com.example.release-date="2015-02-12"
```
See [Understanding object labels](/manuals/engine/manage-resources/labels.md)
for guidelines about acceptable label keys and values. For information about
querying labels, refer to the items related to filtering in
[Managing labels on objects](/manuals/engine/manage-resources/labels.md#manage-labels-on-objects).
See also [LABEL](/reference/dockerfile.md#label) in the Dockerfile reference.
### RUN
Split long or complex `RUN` statements on multiple lines separated with
backslashes to make your Dockerfile more readable, understandable, and
maintainable.
For example, you can chain commands with the `&&` operator, and use
escape characters to break long commands into multiple lines.
```dockerfile
RUN apt-get update && apt-get install -y --no-install-recommends \
package-bar \
package-baz \
package-foo
```
By default, backslash escapes a newline character, but you can change it with
the [`escape` directive](/reference/dockerfile.md#escape).
You can also use here documents to run multiple commands without chaining them
with a pipeline operator:
```dockerfile
RUN <<EOF
apt-get update
apt-get install -y --no-install-recommends \
package-bar \
package-baz \
package-foo
EOF
```
For more information about `RUN`, see [Dockerfile reference for the RUN instruction](/reference/dockerfile.md#run).
#### apt-get
One common use case for `RUN` instructions in Debian-based images is to install
software using `apt-get`. Because `apt-get` installs packages, the `RUN
apt-get` command has several counter-intuitive behaviors to look out for.
Always combine `RUN apt-get update` with `apt-get install` in the same `RUN`
statement. For example:
```dockerfile
RUN apt-get update && apt-get install -y --no-install-recommends \
package-bar \
package-baz \
package-foo
```
Using `apt-get update` alone in a `RUN` statement causes caching issues and
subsequent `apt-get install` instructions to fail. For example, this issue will occur in the following Dockerfile:
```dockerfile
# syntax=docker/dockerfile:1
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y --no-install-recommends curl
```
After building the image, all layers are in the Docker cache. Suppose you later
modify `apt-get install` by adding an extra package as shown in the following Dockerfile:
```dockerfile
# syntax=docker/dockerfile:1
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y --no-install-recommends curl nginx
```
Docker sees the initial and modified instructions as identical and reuses the
cache from previous steps. As a result the `apt-get update` isn't executed
because the build uses the cached version. Because the `apt-get update` isn't
run, your build can potentially get an outdated version of the `curl` and
`nginx` packages.
Using `RUN apt-get update && apt-get install -y --no-install-recommends` ensures your Dockerfile
installs the latest package versions with no further coding or manual
intervention. This technique is known as cache busting. You can also achieve
cache busting by specifying a package version. This is known as version pinning.
For example:
```dockerfile
RUN apt-get update && apt-get install -y --no-install-recommends \