记录一次 docker 的 /bin/sh: xxx : not found
create: 2024-04-29
在一次部署 CI/CD 的过程中,遇到了一个很奇怪的问题。镜像中存在 /app/main,也具备可执行权限。但是一执行就 not found
起因
事情的起因是这样,在编写完 dockerfile
和 CI
文件后,打包镜像上传正常,也确认打包后的镜像 /app/main
确实存在,也具备可执行权限。之后部署容器就出问题了,死活报错: /bin/sh: /app/main: not found
。于是我把容器中的文件拷贝到宿主机中运行,最奇怪的事情发生了,正常运行。
于是我怀疑是在 CI
流中打包的 main
有毒,然后我就在本地打包 main
,然后上传到 CI
流中执行。果然,容器运行成功了。事情到这就结束了吗,显然没有,如果 CI
流打包的 main
真的有毒的话。那为什么之前拷贝到宿主机中又能运行成功呢?
结论
经过了和小伙伴们探讨,折腾了大半天,才发现,原来 CI
流环境是 Ubutun
,而 dockerfile
中的基础镜像是 Alpine
。这就导致打包的时候使用的是 Ubuntu
的 glibc
动态链接库,运行的时候使用的 Alpine
的 musl libc
动态链接库。而这两个库是不兼容的,最后在容器中输入 ldd
命令检查,也确实发现了问题:
折腾了大半天,被坑了一个大趔趄。最后也提出两个可行的解决方案:
- CI 流和 dockerfile 使用同一个基础镜像;
- 在 Alpine 中安装
glibc
。
本文目录