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命令的值

小结:

  1. CMD和ENTRYPOINT指令都可以用来定义运行容器时所使用的默认命令

  2. Dockerfile至少指定一个CMD或ENTRYPOINT

  3. CMD可以用作ENTRYPOINT默认参数,或者用作容器的默认命令

  4. docker run指定时,将会覆盖CMD的值

  5. 如果是可执行文件,希望运行时传参,应该使用ENTRYPOINT