docker 记录下go用alpine作为基础镜像出现 no found的问题
创始人
2024-04-04 21:01:03
0

问题:

  在docker里如果用 Centos 获取Ubuntu 做基础镜像执行go二进制文件起码200m往上.可以看看大佬这篇文章来学习如果让镜像文件更小:减少go镜像的大小

我们用 alpine 作为基础镜像构建

FROM alpine:3.14
...

alpline 本身5m大小,大大缩减了镜像的体积.
后续 执行 ./ 二进制文件时 出现 ./project no found .这就奇怪了!

出现原因:

  这里报的 not found 并不是说找不到这个程序,而是说,程序在运行的时候无法找到需要动态链接的目标文件.

那么什么是动态链接呢?

  我们都知道,程序编写完毕后需要编译、链接才能运行。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织,最终形成可执行代码的过程。按理来讲,我们的代码变成可执行的程序的时候,需要调用的代码都已经被链接好了,但是这并不完全准确,因为在此时完成的只是静态链接。

所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。静态链接的问题很明显,它会造成空间的浪费和软件更新的困难。举例来说,当有好几个程序调用了相同的系统函数时,每个程序都把这个函数加载到内存里,重复占用了很多空间,造成了资源的浪费。

动态链接解决了这一问题,其基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。

那么问题就出现了,这个动态链接是和系统内置的库相关的。

glibc 和 musl libc
  The GNU C Library(glibc) 是当代绝大多数 Linux 发行版内置的 C 标准库实现,而 musl libc 则是一个速度快、轻量化的,严格遵循 POSIX 定义的 C 标准库实现。虽然后者试图保持与 glibc 的兼容性,但两者间的差距始终不小,在使用时难免会遇到兼容性问题。

  Alpine 为了简单轻量,没有使用大多数 Linux 发行版使用的 glibc 而选择了 musl libc。 Docker 容器选择了 Alpine 镜像,使用的是 musl libc,所以无法正常动态链接,也就无法运行。

解决方案:

  1. 我们重新以alpline构建一个自己的镜像,这样后面就可以使用:

搜到网上这方式可以解决:

RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
mkdir alpine
mkdir echo "" > Dockerfile
Dockerfile:FROM alpine:3.14RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

执行docker build -t myalpine:3.14 .
以该镜像作为基础镜像执行二进制时.依然出现问题!!! 但这次换了其它not found.看来问题还没解决.
看来上面还有其它动态库引用了,并没有完全解决.

  1. 我们直接把glibc 安装进alpine去.

Dockerfile:

FROM alpine:3.14
ENV GLIBC_REPO=https://github.com/sgerrand/alpine-pkg-glibc
ENV GLIBC_VERSION=2.30-r0RUN set -ex && \apk --update add libstdc++ curl ca-certificates && \for pkg in glibc-${GLIBC_VERSION} glibc-bin-${GLIBC_VERSION}; \do curl -sSL ${GLIBC_REPO}/releases/download/${GLIBC_VERSION}/${pkg}.apk -o /tmp/${pkg}.apk; done && \apk add --allow-untrusted /tmp/*.apk && \rm -v /tmp/*.apk && \/usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib

重新执行docker build -t myalpine:3.14 . (记得把刚刚构建的删除了)
 然后用该镜像去构建你的应用

FROM myalpine:3.14
...

 docker run -d -p …

成了!

总结:

  相比较以前用centos 做基础镜像的 270m往上.现在65m 相对少了一半多.但可能alpine还有以前坑.我还无法得知,不考虑服务器容量的话,直接上centos 或者 Ubuntu吧

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...