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

无法在Docker中构建v8go v0.9.0版本的问题求助

解决v8go v0.9.0在Golang Docker容器中编译时std::__throw_bad_array_new_length()未定义的问题

问题背景

升级v8go到v0.9.0版本后,原本适配v0.8.0的Dockerfile编译失败,报错提示std::__throw_bad_array_new_length()未定义。排查后确认是官方Golang 1.20.1镜像自带的GCC版本过低,无法满足v8go v0.9.0的编译要求,且官方相关issue尚未得到作者回应,需紧急解决。

错误信息

undefined reference to `std::__throw_bad_array_new_length()`

原Dockerfile

# syntax=docker/dockerfile:experimental

# Builder base image
FROM golang:1.20.1 as builder

# Set a directory to work from
WORKDIR /go/src/github.com/foo/bar

# Install dependencies
RUN dpkg --add-architecture amd64 \
    && apt-get upgrade \
    && apt-get install -y --no-install-recommends gcc-x86-64-linux-gnu g++-x86-64-linux-gnu

# Copy everything in and compile
# There may be cache optimizations we can make
COPY . .

# Some of our dependencies are private, so we need to use SSH to clone them.
RUN git config --global url."ssh://git@github.com/".insteadOf "https://github.com/"
RUN mkdir -p ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts


# Build our binary.
RUN --mount=type=ssh GOOS=linux GOARCH=amd64 CC=x86_64-linux-gnu-gcc CXX=x86_64-linux-gnu-g++ make build-go EXTRA_LD_FLAGS="-s -w -extldflags '-dynamic'"

解决方案

核心是升级Docker容器内的GCC版本,以下提供两种可行方案:

方案1:更换基础镜像为Debian 12(Bookworm)版本的Golang镜像

Debian 12自带的GCC版本为12,完全满足v8go v0.9.0的编译要求,修改基础镜像即可:

# syntax=docker/dockerfile:experimental

# 更换为Debian 12的Golang镜像,自带更高版本GCC
FROM golang:1.20.1-bookworm as builder

WORKDIR /go/src/github.com/foo/bar

# 无需额外安装高版本GCC,基础镜像已自带满足要求的版本
RUN dpkg --add-architecture amd64 \
    && apt-get update \
    && apt-get upgrade -y

COPY . .

RUN git config --global url."ssh://git@github.com/".insteadOf "https://github.com/"
RUN mkdir -p ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

# 编译时指定C++标准,确保兼容性
RUN --mount=type=ssh GOOS=linux GOARCH=amd64 CXXFLAGS="-std=c++17" make build-go EXTRA_LD_FLAGS="-s -w -extldflags '-dynamic'"

方案2:在原Debian 11镜像中安装Backports版本的GCC

如果不想更换基础镜像,可通过Debian Backports源安装更高版本的GCC:

# syntax=docker/dockerfile:experimental

FROM golang:1.20.1 as builder

WORKDIR /go/src/github.com/foo/bar

# 添加Backports源并安装高版本GCC
RUN echo "deb http://deb.debian.org/debian bullseye-backports main" >> /etc/apt/sources.list \
    && dpkg --add-architecture amd64 \
    && apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y --no-install-recommends -t bullseye-backports gcc-x86-64-linux-gnu g++-x86-64-linux-gnu

COPY . .

RUN git config --global url."ssh://git@github.com/".insteadOf "https://github.com/"
RUN mkdir -p ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts

RUN --mount=type=ssh GOOS=linux GOARCH=amd64 CC=x86_64-linux-gnu-gcc CXX=x86_64-linux-gnu-g++ CXXFLAGS="-std=c++17" make build-go EXTRA_LD_FLAGS="-s -w -extldflags '-dynamic'"

原理说明

std::__throw_bad_array_new_length()是C11标准引入的函数,v8go v0.9.0依赖的V8引擎或自身代码使用了更高版本的C特性,旧版本GCC(如Debian 11自带的GCC 10)无法正确链接该符号。升级GCC到11及以上版本即可解决此问题。

内容的提问来源于stack exchange,提问作者frankgreco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:31:08