问题
I am trying to get my hands dirty on docker. I know that CMD
or ENTRYPOINT
is used to specify the start/runnable command for docker image and CMD
is overridden by ENTRYPOINT
. But I don't know, how does it works, when parent docker image, also has CMD
OR ENTRYPOINT
or BOTH ?
Does child image inherit those values from parent docker image ? If so, then does ENTRYPOINT
in parent image override CMD
in child image ?
I know that such question is already discussed at https://github.com/docker/compose/issues/3140. But, the discussion is quite old(before 2-3 years) and it doesn't answer my question clearly.
Thanks in advance.
回答1:
If you define an ENTRYPOINT
in a child image, it will null out the value of CMD
as identified in this issue. The goal is to avoid a confusing situation where an entrypoint is passed as args a command you no longer want to run.
Other than this specific situation, the value of ENTRYPOINT
and CMD
are inherited and can be individually overridden by a child image or even a later step of the same Dockerfile. Only one value for each of these will ever exist in an image with the last defined value having precedence.
回答2:
ENTRYPOINT doesn't override CMD, they just represent to parts of resulting command and exist to make life easier. Whenever container is started, the command for process 1 is determined as ENTRYPOINT + CMD, so usually ENTRYPOINT is just path to the binary and CMD is a list of arguments for that binary. CMD can also be easily overriden from command line, so, again, it's just a thing to make life easier and make containers behave just like regular binaries - if you have man
container, you can set entrypoint to /usr/bin/man
and cmd to man
. So if you just start container, docker will execute /usr/bin/man man
, but if you run something like docker run man docker
, the resulting container command will be /usr/bin/man docker
- the entrypoint stays the same, cmd changes, and resulting command to start container is just a simple merging of those.
ENTRYPOINT and CMD are both inherited from parent layers (images) unless overriden, so if you inherit from image X and redefine CMD, you will still have the very same ENTRYPOINT and vice versa. However, as @BMitch mentioned below, changing ENTRYPOINT in child image will effectively reset CMD.
来源:https://stackoverflow.com/questions/49028644/is-cmd-in-parent-docker-overriden-by-cmd-entrypoint-in-child-docker-image