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运行容器实际执行的命令

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

bash 复制代码
docker ps -a --non-trunc |grep ${容器名} 

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

bash 复制代码
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"**为什么就没问题

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

bash 复制代码
docker ps -a --non-trunc |grep ${容器名} 

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

bash 复制代码
sh -c 'curl www.baidu.com'

用单引号包起 curl www.baidu.com 了,使其作为一个参数传给sh执行。都是sh若的祸
总结: docker 使用 **ENTRYPOINT "sh","-c" **配置时就只能跟一个参数,第三个参数需放完整命令

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

bash 复制代码
 ENTRYPOINT ["java","-jar","hello.jar" ]
相关推荐
Moshow郑锴13 分钟前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
Wang's Blog7 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
梦想不只是梦与想8 小时前
docker-compose.yml
docker·docker-compose·docker run
\光辉岁月/9 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang9 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
郑州光合科技余经理10 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_9620715710 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat10 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源10 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog10 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言