Sipexer 是一款非常不错的命令行 SIP 客户端,由 Kamailio 的主要作者和维护者 Daniel-Constantin Mierla 编写。虽然我不知道用它连接语音信道以用作 “电话 “的任何方法,但它确实为测试 SIP 应用程序提供了一种创建模拟测试呼叫的有用方法。唯一的 “问题 “是什么?预编译二进制文件无法在默认的 Alpine Linux 容器中 “正常工作”。事实上,会出现这种非常奇怪的情况:
~ # ls -l
total 13212
-rw-r--r-- 1 root root 35149 Jun 30 08:57 LICENSE
-rw-r--r-- 1 root root 12972 Jun 30 08:57 README.md
-rwxr-xr-x 1 root root 8637840 Jun 30 08:57 sipexer
-rw-r--r-- 1 root root 4835043 Aug 31 13:07 sipexer-v1.1.0-linux-amd64.tar.gz
~ # ./sipexer
/bin/sh: ./sipexer: not found
~ #
因此,尽管该文件存在并且具有可执行权限,但它…… 找不到?
为什么是sipexer: not found
?
我不会声称在这个问题上有大量的经验,但谷歌搜索“在 alpine 上找不到 golang 二进制文件”表明这种事情并不罕见。问题在于动态链接失败。在 Alpine Linux 上最常见的情况是,Alpine 不使用glibc
,而是使用muscl
。这些差异远远超出了这篇文章和我的专业知识。然而,很常见的是,有一些 Alpine 包通常会为我们“处理这个问题”,其中名为 gcompat
的软件包就能正常工作,让我们用 Dockerfile 试试看:
FROM alpine:3.18
## Add will extract the tarball. Extracting it to a location and later moving
## it to $PATH will increase the image size.
ADD sipexer-v1.1.0-linux-amd64.tar.gz /usr/bin
RUN apk add --no-cache gcompat
ENTRYPOINT sipexer
构建:
docker build -f Dockerfile.prebuilt -t sipexer:prebuilt .
生成的图像大小为 16.2 MB,可以正常工作。下面的示例将向 localhost 发送一条 OPTIONS 消息,但任何 sipexer 参数都可以直接传递给该命令。
docker run --rm -it sipexer:prebuilt
有更好的方法吗?
上面的例子效果很好——特别是如果你想要一个只执行 sipexer 的容器。但是,如果想将其作为诊断实用程序包含在另一个容器中怎么办?当然,你可以加载二进制文件并安装 gcompat,但是专门为 Alpine 构建二进制文件怎么样?以下将在多阶段构建中执行此操作:
FROM golang:1.21-alpine3.18 AS build
RUN apk add --no-cache git \
&& cd / \
&& git clone https://github.com/miconda/sipexer.git \
&& cd sipexer \
&& go get ./... \
&& go build .
FROM alpine:3.18
COPY --from=build /sipexer/sipexer /usr/bin/sipexer
ENTRYPOINT sipexer
构建:
docker build -f Dockerfile.native -t sipexer:native .
这同样会创建一个默认运行 sipexer 的容器。那么,这样做有什么好处呢?嗯,它的大小略小,只有 15.9 MB(在我的构建中整整小了 249,114 字节)。但是,大小并不是唯一的因素。事实上,如果有更多的便利和理由来使用更大的图像,大小差异就不重要了。还有什么?这个二进制文件在 docker 镜像之间的入口就是最大的例子。在没有任何其他实际操作的情况下。构建时间比第一个例子要长,但它会被缓存起来,所以只要指令不改变,就可以很容易地重复使用。想把它添加到装有 Kamailio 的容器中:
FROM sipexer:native AS sipexer
FROM alpine:3.18
COPY --from=sipexer /usr/bin/sipexer /usr/bin/sipexer
RUN apk add --no-cache kamailio
提取二进制文件!
这是原生构建镜像的真正优势,您可以将其从镜像中复制出来并在任何地方使用。它可以在我的 Debian 发行版上运行,而且我怀疑它也可以在大多数其他 Linux 发行版上运行!
docker create --name sipexer_container sipexer:native
docker cp sipexer_container:/usr/bin/sipexer ./
docker rm sipexer_container
原文:https://kaufmania.wordpress.com/2023/08/31/sipexer-in-alpine/
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/35084.html