Dockerfile Reference – ENTRYPOINT
Hope you’re doing good and utilizing your time in learning new things, in this article we’ll understand ENTRYPOINT instruction being used in Dockerfile. For other related articles, please refer index page.
ENTRYPOINT Instruction :
ENTRYPOINT Instruction allows you to configure a starting point which will be triggered when your container will be sponned from the image. Available forms,
# exec form - this is preffered one. ENTRYPOINT ["executable", "param1", "param2"] # shell form ENTRYPOINT command param1 param2
- Only the last ENTRYPOINT instruction in Dockerfile will be considered as an ENTRYPOINT, if base image and Dockerfile both contains ENTRYPOINT, the base image’s instruction will be ignored.
- You can override ENTRYPOINT runtime by using –entrypoint instruction, like docker run –entrypoint.
- Any runtime argument passed to docker run command after image will be passed to ENTRYPOINT and will override arguments mentioned in CMD instruction, for example docker run <image> -H, here -H will be passed as a argument to ENTRYPOINT instruction.
- When you’re using shell form, any runtime arguments will be ignored.
- If you use shell form, it will be executed as a subcommand of /bin/sh -c, which will not start your command as PID 1. Because of which docker stop <image> command will not run. To overcome this, make sure you use exec as command (we’ll understand with example).
EXEC form :
We can use exec form to set the base command as ENTRYPOINT to the image. For additional parameters we can use CMD instruction which can be overrided runtime. let’s take an example for the same.
FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]
When we execute above image, top is the only process,
Once we’re done with the experiments, we can stop container using docker stop test1. please find below some more examples for entrypoint.
# ENTRYPOINT to start apache2 in foreground ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] # Writing custom script to do preprocess and then start server ENTRYPOINT ["/usr/src/start_server.sh"]
Shell form :
We can also specify plain string for the ENTRYPOINT and it will get executed in /bin/sh -c. While working with shell form, you need to make sure to use exec as command, otherwise your process will not start with pid 1 and docker stop command will not work. Moreover any runtime parameters will be ignored, as shell form doesn’t take any runtime arguments. Let’s check example for same.
# Shell form where we have not used exec as command. FROM ubuntu ENTRYPOINT top -b
Trying to stop container
Let’s observe outcome closely,
1. top was not started with PID 1, as we had in previous scenario.
2. Continer failed to stop cleanly, it has to send SIGKILL after timeout to stop the container.
let’s check example when we use exec.
FROM ubuntu ENTRYPOINT exec top -b
That’s it for this article, hope you got to know something new by this article. Please let me know your suggestion / doubt / feedback in comments. For other related articles, please refer index page. Stay Safe and Happy Learning !!
Reference : https://docs.docker.com