无法在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
相关产品推荐
相关产品推荐

