docker ENTRYPOINT [“sh“,“-c“,“java“,“-jar“,“Hello.jar“] 启动失败问题分析

 因为没系统的学过linux语法,所以才会产生如下疑问。大佬请跳过。

问题:当在dockerfile里面配置 ENTRYPOINT  ["sh","-c","java","-jar","Hello.jar"] ,启动对应容器时会无法正常运行,docker 查看日志信息如下所示:

但是配置  ["sh","-c","java -jar Hello.jar"] 却可以。docker 是可以支持多个参数用逗号分割的,所以个人理解上面的两种配置是等同的。

原因定位:接下来以配置 ENTRYPOINT  ["sh","-c","curl","www.baidu.com"]  为例。

1.运行结果对比:

        如果是直接执行 curl www.baidu.com ,效果如下所示

         而用docke配置 ENTRYPOINT  ["sh","-c","curl","www.baidu.com"] 运行容器后查看日志看到的效果如下所示。

2.查看docker运行容器实际执行的命令

用如下命令可以查看容器启动时执行的命令是什么

docker ps -a --non-trunc |grep ${容器名} 

可以看出 docker 启动容器运行的命令如下所示

sh -c curl www.baidu.com

看起来好像也没啥问题

3.基于docker实际执行命令分析错误原因

直接使用docker运行的命令在linux终端执行执行,发现效果和docker容器执行是一样的

而区别在于前面多了 sh -c, 执行 man sh

发现sh -c 只会取后面的第一个参数,既 www.baidu.com 会被忽略掉

4.分析ENTRYPOINT  ["sh","-c","curl www.baidu.com"] 为什么就没问题

继续用如下命令查看容器启动时执行的命令是什么

docker ps -a --non-trunc |grep ${容器名} 

可以看出 docker 启动容器运行的命令如下所示

sh -c 'curl www.baidu.com'

用单引号包起 curl www.baidu.com 了,使其作为一个参数传给sh执行。都是sh若的祸

总结: docker 使用  ENTRYPOINT ["sh","-c" ] 配置时就只能跟一个参数,第三个参数需放完整命令

如果想把完整命令拆成多个逗号分割,就不要加 sh -c,直接使用命令就好 

 ENTRYPOINT ["java","-jar","hello.jar" ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值