oldme 博客

老当益壮,宁移白首之心?穷且益坚,不坠青云之志。

记录一次 docker 的 /bin/sh: xxx : not found

oldme create: 2024-04-29

在一次部署 CI/CD 的过程中,遇到了一个很奇怪的问题。镜像中存在 /app/main,也具备可执行权限。但是一执行就 not found

起因

事情的起因是这样,在编写完 dockerfileCI 文件后,打包镜像上传正常,也确认打包后的镜像 /app/main 确实存在,也具备可执行权限。之后部署容器就出问题了,死活报错: /bin/sh: /app/main: not found。于是我把容器中的文件拷贝到宿主机中运行,最奇怪的事情发生了,正常运行。

于是我怀疑是在 CI 流中打包的 main 有毒,然后我就在本地打包 main,然后上传到 CI 流中执行。果然,容器运行成功了。事情到这就结束了吗,显然没有,如果 CI 流打包的 main 真的有毒的话。那为什么之前拷贝到宿主机中又能运行成功呢?

结论

经过了和小伙伴们探讨,折腾了大半天,才发现,原来 CI 流环境是 Ubutun,而 dockerfile 中的基础镜像是 Alpine。这就导致打包的时候使用的是 Ubuntuglibc 动态链接库,运行的时候使用的 Alpinemusl libc 动态链接库。而这两个库是不兼容的,最后在容器中输入 ldd 命令检查,也确实发现了问题:

折腾了大半天,被坑了一个大趔趄。最后也提出两个可行的解决方案:

  1. CI 流和 dockerfile 使用同一个基础镜像;
  2. 在 Alpine 中安装 glibc 。
评论

欢迎您的回复 取消回复

您的邮箱不会显示出来,*必填

本文目录