Docker ENTRYPOINT报“No such file or directory”问题排查求助
Docker ENTRYPOINT 启动程序失败的问题分析与解决
嘿,这个报错的根源很明确——你ENTRYPOINT的JSON数组参数格式写错了!
为什么会出现No such file or directory?
你写的ENTRYPOINT是:
ENTRYPOINT ["/usr/bin/app", "-s" "/scene/scene.json", "-c", "/scene/simulator.json", "--headless", "1", "-t"]
注意看"-s" "/scene/scene.json"这部分——你把-s和它对应的参数/scene/scene.json合并成了一个数组元素!Docker会把整个字符串/usr/bin/app,-s /scene/scene.json(没错,它会把这个带空格的内容当成一个完整的可执行文件路径)去查找,自然找不到这个不存在的文件,所以才会报[/usr/bin/app,: No such file or directory的错误。
怎么修复?
把每个命令参数都单独拆成数组的一个元素,修正后的Dockerfile应该是这样:
FROM archlinux RUN pacman -Syu --noconfirm ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 ADD app /usr/bin # 每个参数单独作为数组项,包括-s和它的路径参数 ENTRYPOINT ["/usr/bin/app", "-s", "/scene/scene.json", "-c", "/scene/simulator.json", "--headless", "1", "-t"] CMD ["0"]
额外的小提示
ENTRYPOINT和CMD的配合逻辑:用JSON数组格式时,CMD里的内容会自动追加到ENTRYPOINT命令的末尾作为参数。比如你现在的配置,容器默认启动时会执行:
/usr/bin/app -s /scene/scene.json -c /scene/simulator.json --headless 1 -t 0你在
docker run最后加的0其实是覆盖了CMD里的内容,效果和默认一致,后续如果要改默认参数,直接调整CMD就行,不用每次run都手动加。确保程序可执行:如果修正后还是有问题,建议在Dockerfile里加一步,确保
/usr/bin/app有执行权限:RUN chmod +x /usr/bin/app
内容的提问来源于stack exchange,提问作者jjcasmar
相关产品推荐
相关产品推荐

