You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}

验证步骤

  1. 先确认宿主机已加载SCTP内核模块:
modprobe sctp
lsmod | grep sctp
  1. 重新构建镜像并测试:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:15:07