镜像的制作CMD与ENTRYPOINT区别
1.构建镜像时必须指定一个CMD 或者ENTRYPOINT 去夯住进程,不让它退出,放在容器前台执行,否则容器就退出了。
2.CMD exec 形式变量传参需要指定(“sh”,“-c”,“/usr/bin/run.sh $abc”)
FROM centos:7
LABEL maintalner liuzhe
COPY run.sh /usr/bin
ENV abc=azhe
EXPOSE 80
CMD [“sh”,“-c”,“/usr/bin/run.sh $abc”]
3.CMD shell形式直接使用变量传参
FROM centos:7
LABEL maintalner liuzhe
COPY run.sh /usr/bin
ENV abc=azhe
EXPOSE 80
CMD run.sh $abc
4.docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
docker run -d test run.sh liuzhe
通过命令行指定的形式覆盖Dockerfile 中的CMD命令
5.docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
docker run -d test run.sh wangwu
通过命令行指定的形式覆盖Dockerfile 中的ENTRYPOINT命令需要指定 --entrypoint参数
6.当CMD和ENTRYPOINT配合使用时,CMD的值会作为ENTRYPOINT 的默认参数
FROM centos:7
LABEL maintalner liuzhe
COPY run.sh /usr/bin
ENV abc=azhe
EXPOSE 80
ENTRYPOINT [“run.sh”] #ENTRYPOINT执行 可执行文件 必须使用exec的形式
CMD [“hello”,“libai”] #CMD的值为ENTRYPOINT传参
#####run.sh#######
#!/bin/bash
echo $@
sleep 70000
最终执行的命令就是
/usr/bin/run.sh hello libai
docker run -d test hello liuzhe 也可以通过命令行的形式覆盖CMD命令的值
小结:
-
CMD和ENTRYPOINT指令都可以用来定义运行容器时所使用的默认命令
-
Dockerfile至少指定一个CMD或ENTRYPOINT
-
CMD可以用作ENTRYPOINT默认参数,或者用作容器的默认命令
-
docker run指定
时,将会覆盖CMD的值 -
如果是可执行文件,希望运行时传参,应该使用ENTRYPOINT