在使用Dockerfile創(chuàng)建image時, 下面三條指令比較容易混淆篡悟。
RUN, CMD, ENTRYPOINT.
RUN是在building image時會運行的指令, 在Dockerfile中可以寫多條RUN指令.
CMD和ENTRYPOINT則是在運行container 時會運行的指令, 都只能寫一條, 如果寫了多條, 則最后一條生效.
CMD和ENTRYPOINT的區(qū)別是:
CMD在運行時會被command覆蓋, ENTRYPOINT不會被運行時的command覆蓋, 但是也可以指定.
例如 :
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--entrypoint=" " Overwrite the default entrypoint of the image
docker run postgres:9.3.5 psql
這里的psql就是command, 將覆蓋Dockerfile的CMD, 但是不會覆蓋ENTRYPOINT.
如果要覆蓋ENTRYPOINT, 那么可以在docker run運行時輸入 --entrypoint="....".
CMD和ENTRYPOINT一般用于制作具備后臺服務的image, 例如apache, database等. 在使用這種image啟動container時, 自動啟動服務.
同樣執(zhí)行 docker run -it --rm <image_name> hello world
如果是ENTERYPOINT ["/bin/bash"]
那么實際運行的命令是 /bin/bash hello world
如果是CMD ["/bin/bash"]
那么實際運行的命令是 hello world
即李请,運行容器時的命令在 ENTERYPOINT 時是作為 ENTERYPOINT 的參數傳遞的;在使用 CMD 時是直接替換 CMD 的侠碧。
所以有一種取巧的用法,在 dockerfile 中同時使用二者:
ENTRYPOINT ["mongod"]
CMD ["--help"]
這樣用戶不僅可以自定義啟動 mongod 的參數缠黍,在不指定參數的時候還可以默認使用 --help 顯示幫助信息