CMD和Entrypoint命令使用变量的用法

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 提供的参数覆盖。
 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

从以上内容中可以看出,可以看到有两个共同点:
1.都可以指定shell或exec函数调用的方式执行命令;
2.当存在多个CMD指令或ENTRYPOINT指令时,只有最后一个生效;

但是在涉及到使用变量的时候只有shell的方式才可以,exec函数的形式不行

举例来说:

# Dockerfile文件内容
ENTRYPOINT [ "yarn", "run", "app-${ENV_CONFIG_INT}" ]

# Compose yaml
  test:
    image: testimage/test:v1.0
    build:
      context: .
      dockerfile: Dockerfile
    env_file:
      - ./docker.env
    environment:
    - ENV_CONFIG_INT=1

如上形式启动的时候会报错:

error Command "app-${ENV_CONFIG_INT}" not found.

这是因为ENTRYPOINT(以及CMD和RUN)的shell形式支持扩展环境变量,但是使用exec形式不扩展变量或处理任何其他shell构造。

也就是说使用要想处理变量的话,必须使用shell形式,也就是

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

ENTRYPOINT command param1 param2(shell中执行)。

比如启动jar包文件

# 使用如下这种形式设置变量就不行
ENTRYPOINT ["java","${PARAMS}","${JAVA_OPTS}","-Djava.security.egd=file:/dev/./urandom","-jar","demo-0.0.1-SNAPSHOT.jar"]

# 可以使用这种形式
ENTRYPOINT ["sh", "-c", "java ${PARAMS} ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar demo-0.0.1-SNAPSHOT.jar"]
ENTRYPOINT java ${PARAMS} ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar demo-0.0.1-SNAPSHOT.jar

扩展
exce形式和shell形式的区别
shell表单阻止使用任何CMD或run命令行参数,但其缺点是ENTRYPOINT将作为/bin/sh-c的子命令启动,该子命令不传递信号。这意味着可执行文件不会是容器的PID 1,也不会接收Unix信号,因此您的可执行文件不会从docker stop接收SIGTERM。

posted @   哈喽哈喽111111  阅读(3727)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-01-21 六、Scrapy中Download Middleware的用法
2019-01-21 五、Scrapy中Item Pipeline的用法
2019-01-21 四、Spider用法
点击右上角即可分享
微信分享提示