首先明确一下概念:
run:执行命令并创建新的 image layer
cmd:设置容器启动后默认执行的命令和参数
entrypoint:设置容器启动时运行的命令
在介绍cmd和entrypoint之前,先了解一下shell和exec格式:
- shell:
FROM centos
RUN apt-get install -y vim
ENV name docker
CMD echo "hello docker"
ENTRYPOINT echo "hello $name "
- exec
FROM centos
RUN ["apt-get", "install", "-y", "vim"]
ENV name docker
CMD ["/bin/echo", "hello docker"]
ENTRYPOINT ["/bin/bash","-c", "echo hello $name "]
- build一个docker
cd somefile
docker build -t cc/xxx .
CMD
容器启动时默认执行的命令
FROM centos
ENV name docker
CMD echo "hello $name"
情况一:如果docker run指定了其它命令,CMD命令被忽略
docker run -it [image] /bin/bsh
情况二:如果定义了多个CMD,只有最后一个执行
...
CMD echo "hello ab"
CMD echo "hello $name" # 只执行这个
ENTRYPOINT
让容器以应用程序或者服务的形式运行
特点:不会被忽略,一定执行
最佳实践:写一个shell脚本作为entrypoint
COPY docker-entrypoint.sh /usr/local/bin
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 27017
CMD ["mongoDB"]