Rocky Linux Docker镜像源码编译Erlang后gen_sctp:open报错如何解决
问题根因
Rocky Linux 8属于RHEL 8衍生版本,该系列系统的lksctp-tools包调整了SCTP相关宏的定义规则,SCTP_SENDALL等SCTP扩展宏仅在定义了_GNU_SOURCE编译参数时才会被头文件暴露。你使用的OTP 22.x版本的configure检测逻辑未适配该规则,即使指定了--enable-sctp参数,编译阶段也会因为检测不到相关宏,导致SCTP模块功能不完整,运行时调用就会抛出bad argument错误。
Rocky官方源的Erlang RPM包没有该问题,是因为官方打包时已经添加了适配RHEL 8系列的编译参数。
解决方案
修改你的Dockerfile中Erlang编译的configure环节,手动添加_GNU_SOURCE编译参数即可,修改后的编译段如下:
RUN wget https://github.com/erlang/otp/releases/download/OTP-${ERLANGOTP_VERSION}/${ERLANGOTP_ARCHIVE} -O /tmp/${ERLANGOTP_ARCHIVE} && \ tar -xf /tmp/${ERLANGOTP_ARCHIVE} -C /tmp && \ pushd /tmp/${ERLANGOTP_DIR_NAME} && \ ./otp_build autoconf && \ # 新增CFLAGS="-D_GNU_SOURCE"参数适配RHEL 8系列的宏定义规则 CFLAGS="-D_GNU_SOURCE" ./configure \ --enable-sctp \ --prefix=/usr/local \ && \ make -j $(nproc) -l $(nproc) && \ make install && \ rm -rf /tmp/${ERLANGOTP_DIR_NAME} /tmp/${ERLANGOTP_ARCHIVE}
验证步骤
- 先确认宿主机已加载SCTP内核模块:
modprobe sctp lsmod | grep sctp
- 重新构建镜像并测试:
docker build -t erltest:1.0.0 . docker run -it --rm erltest:1.0.0 erl # 进入Erlang shell后执行测试命令 gen_sctp:open().
正常情况下会返回{ok,#Port<xxxx>}的成功结果,该方案对OTP 22.3.4.11、22.3.4.23版本均适用。
内容的提问来源于stack exchange,提问作者Diodak
相关产品推荐
相关产品推荐

