The Dockerfile should contain at most one ENTRYPOINT and one CMD instruction, because only the last one will have an effect.

Why is this an issue?

Multiple ENTRYPOINT or CMD instructions in a file can lead to confusion as we may think they are all applied. This is not the case, as only the last one is applied.

How to fix it

Previous ENTRYPOINT and CMD instructions should be removed to avoid this.

Code examples

Noncompliant code example

FROM busybox
ENTRYPOINT ignored_entrypoint param1 param2
ENTRYPOINT effective_entrypoint param1 param2

CMD ignored_cmd param1 param2
CMD effective_cmd param1 param2

Here we have multiple ENTRYPOINT and CMD instructions. The first ENTRYPOINT and the first CMD instructions will have no effect. Although this is valid in Docker, this can lead to confusion and be error-prone, as we may expect each CMD and ENTRYPOINT to have an effect.

Multi-Stage Build:

FROM scratch as development
CMD ignored_scratch_cmd param1 param2
CMD effective_scratch_cmd param1 param2

FROM busybox
CMD ignored_busyBox_cmd param1 param2
CMD effective_busyBox_cmd param1 param2

For multi-stage builds we take each stage into account separately. This is because there are valid docker setups, where the file should only be build up to a certain stage. In the example, the developer builds only the first stage as a development environment via docker build --target development.

Compliant solution

FROM busybox
ENTRYPOINT effective_entrypoint param1 param2

CMD effective_cmd param1 param2

Here we have only one ENTRYPOINT and one CMD instruction. Each of them will be considered by the docker container and have a normal effect, as we can expect.

Multi-Stage Build:

FROM scratch as development
CMD effective_scratch_cmd param1 param2

FROM busybox
CMD effective_busyBox_cmd param1 param2

For each stage, we only have one CMD or ENTRYPOINT instruction.

Resources

Documentation