docker run 命令的选项
    —attach , -a Attach to STDIN, STDOUT or STDERR
    —detach , -d Run container in background and print container ID
    —interactive , -i Keep STDIN open even if not attached
    —tty , -t Allocate a pseudo-TTY

    • 0: stdin0 :标准输入
    • 1: stdout1 :标准输出
    • 2: stderr2 :标准错误

    其中-a 可以多次指定 ,比如 -a stdin -a stdout
    docker的默认情况下:前台运行,stdout 和 stderr 转接出来,而stdin关了
    -d=false, -i=false, -t=false

    情况1: 当只指定-a stdin时容器会在前台运行,crtl+c也无法退出
    image.png

    情况2: 当只指定-a stdout时容器只会输出标注输出
    image.png

    情况3: 当只指定-a stderr时容器只会输出标注错误,正常输出不会显示到命令行
    image.png
    image.png
    但不论如何设置-a参数,docker logs一直可以看到错误输出和标注输出
    image.pngimage.png

    Dockerfile:
    CMD
    支持三种格式
    CMD [“executable”,”param1”,”param2”] 使用 exec 执行,推荐方式;
    CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
    CMD [“param1”,”param2”] 提供给 ENTRYPOINT 的默认参数;
    指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
    如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
    ENTRYPOINT
    两种格式:
    ENTRYPOINT [“executable”, “param1”, “param2”]
    ENTRYPOINT command param1 param2(shell中执行)。
    配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
    差异1:CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖,而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。
    差异2:CMD指令可以为ENTRYPOINT指令设置默认参数,而且可以被docker run指定的参数覆盖;

    如果容器中配置了command,那么就使用容器中的command,参数args如果配置了则使用,如果没有配置,就不带参数执行command
    如果容器中没有配置command,只是配置了args:使用Dockerfile中提供的命令,参数使用容器中配置的args
    如果容器中command,args都没有配置:使用Dockerfile中的默认配置