在使用Dockerfile创建image时, 下面三条指令比较容易混淆。
RUN, CMD, ENTRYPOINT.
RUN是在building image时会运行的指令, 在Dockerfile中可以写多条RUN指令.
CMD和ENTRYPOINT则是在运行container 时会运行的指令, 都只能写一条, 如果写了多条, 则最后一条生效.
CMD和ENTRYPOINT的区别是:
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时, 自动启动服务.
同样执行 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 显示帮助信息
网友评论