Alpine Linux 容器中的 Sipexer

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

(0)

相关推荐

发表回复

登录后才能评论