Docker run使用--entrypoint执行cp拼接命令启动报错原因问询
错误原因
- 核心原因:
--entrypoint的解析规则不支持直接传入带shell语法的命令串
Docker的--entrypoint参数默认会将传入的值当做单个可执行程序的路径处理,你传入的cp configs var/opt/configs/ && java -jar app.jar是包含shell逻辑连接符&&的复合命令,会被Docker整体识别为一个可执行文件名去系统路径查找,显然不存在名称为这整串字符的程序,因此触发no such file or directory报错。 - 辅助原因:shell语法需要对应进程解析
&&属于shell专属的语法关键字,只有在sh/bash等shell进程中运行才会被正确识别为「前序命令执行成功再执行后序命令」的逻辑,直接传给entrypoint没有对应进程处理该语法,本身也无法正常执行。
另外还有两个容易触发后续报错的隐藏问题:
- 你写的目标路径
var/opt/configs/是相对路径,建议改为绝对路径/var/opt/configs/避免工作目录变动导致拷贝失败;同时要提前确认目标目录存在,不存在的话可以在命令前加mkdir -p /var/opt/configs创建。 - 原Dockerfile中jar包是拷贝到根目录的
/app.jar,你命令中写的app.jar是相对路径,建议替换为绝对路径避免找不到文件。
符合要求的正确运行命令
docker run --entrypoint="sh" app:latest -c "mkdir -p /var/opt/configs && cp -r configs /var/opt/configs/ && java -jar /app.jar"
原理是显式将entrypoint指定为shell程序sh,然后通过sh的-c参数传入整串复合命令,由sh进程负责解析执行shell语法,就能符合要求完成配置拷贝和启动的操作。
内容的提问来源于stack exchange,提问作者Red cartridge
相关产品推荐
相关产品推荐

