本人实践:
# 下面这种写法会将变量值$MAIN_DLL当成字符串处理 ENTRYPOINT ["/usr/bin/dotnet","/app/$MAIN_DLL"] # 下面这种写法会把"/usr/bin/dotnet","/app/$MAIN_DLL"分开执行,且变量值$MAIN_DLL结果为空 ENTRYPOINT ["sh", "-c","/usr/bin/dotnet","/app/$MAIN_DLL"] # 正确写法1-多个脚本不使用环境变量:(结论:ENV环境变量只会在Shell脚本的首次执行起作用,多条脚本分开后面的命令会取不到环境变量) ENTRYPOINT ["/usr/bin/dotnet","/app/WebApplication.dll"] # 正确写法2-单个脚本使用环境变量:(结论:ENV环境变量只会在Shell脚本的首次执行起作用,多条脚本分开后面的命令会取不到环境变量) ENTRYPOINT ["sh", "-c","/usr/bin/dotnet /app/${MAIN_DLL}"]
A-CMD,ENTRYPOINT命令区别
CMD: 启动容器后,提供默认命令及参数 (不一定会执行,只是默认) 会docker run 后面参数替换 ENTRYPOINT: 启动容器时执行(一定会执行)
/* 例如: Dockerfile 中: FROM centos //必须现有base镜像,否则Error:No build stage in current context RUN touch ceshi_cmd //run创建新镜像层,安装软件包 CMD echo "hello with cmd" ENTRYPOINT echo "hello with entrypoint" */ docker run -it this //运行 显示 ENTRYPOINT的内容 // ENTRYPOINT一定会执行,没有enrtypoint则会执行 cmd的内容 //cmd 作为默认选项 ,如果run it 带参数,则cmd不会执行
B-CMD的使用
CMD 指令允许用户指定容器的默认执行的命令。 三种格式: Excel: CMD ["executable","param1","param2"] ExceL参数:CMD ["param1","param2"] //用来为ENTRYPOINT 提供参数,此时entrypoint必须用Exce Shell: CMD command param1 param2
例: /* CMD echo "Hello world" // docker run -it [image] 输出: Hello World // docker run -it [image] /bin/bash 此时会进入 /bin/bash命令,忽视cmd // docker run -it [image] “param" 加参数会出现错误 */
图例:
C-ENTRYPOINT的使用:
ENTRYPOINT : Exec格式 用使用CMD的参数,run [image] 会替代CMD参数,会使用 run 中的多个参数 例: /* ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"] //表示默认参数,没提供参数,则使用此参数 docker run -it [image] 输出:Hello world docker run -it [image] "hanke" 输出 Hello hanke ,不使用默认参数 docker run -it [image] "hanke" "hujing" 输出 Hello hankd hujing 使用多个提供参数 */ Shell格式 :不会使用 CMD参数,run [image] 参数
图例:
//entrypoint 使用参数
//entrypoint不使用cmd参数和[image]参数
shell和Exec格式
Shell格式Example: Exec格式Example: RUN apt-get install python3 RUN ["apt-get", "install", "python3"] CMD echo "Hello world" CMD ["/bin/echo", "Hello world"] ENTRYPOINT echo "Hello world" ENTRYPOINT ["/bin/echo", "Hello world"] Sheel格式中的命令会直接被sheel解析: 而Exec格式不会直接解析,需要加参数 例: ENV name Cloud Man ENTRYPOINT ["/bin/echo", "Hello, $name"] //输出 Hello,Cloud Man ENV name Cloud Man ENTRYPOINT ["/bin/sh","echo Hello, $name"] //输出 Hello,$name ["/bin/sh","-c","echo Hello, $name"] //输出 /bin/sh:Hello,Cloud Man Command not found Warming: CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解 RUN 则两种格式都可以。
感谢:https://blog.csdn.net/weixin_42971363/article/details/91506844