# 使用Docker编译Alpine平台的msquic

你要安装一个 docker desktop,在windows上

1、写一个编译msquic的dockerfile

文件名 和 位置,你随意,我这里叫 Dockerfile-msquic,放在了C:\Users\snltty\Desktop

C#
FROM alpine:latest

ENV TZ=Asia/Shanghai DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
RUN echo "https://mirrors.ustc.edu.cn/alpine/latest-stable/main/" > /etc/apk/repositories \
    && ln -snf /usr/share/zoneinfo/$clTZ /etc/localtime \
    && echo $TZ > /etc/timezone

RUN apk add --upgrade --no-cache \
        cmake \
        g++ \
        gcc \
        git \
        numactl-dev \
        linux-headers \
        lttng-ust-dev \
        make \
        musl-dev \
        openssl-dev \
        perl

RUN git clone --depth 1 --single-branch --branch v2.3.6 --recursive https://github.com/microsoft/msquic /tmp/msquic

WORKDIR /tmp/msquic

RUN cmake -B build/linux/openssl3 \
       -DQUIC_OUTPUT_DIR=/tmp/msquic/artifacts/bin/linux/openssl3 \
       -DCMAKE_BUILD_TYPE=Release \
       -DQUIC_TLS=openssl3 \
       -DQUIC_ENABLE_LOGGING=true \
       -DQUIC_USE_SYSTEM_LIBCRYPTO=true \
       -DQUIC_BUILD_TOOLS=off \
       -DQUIC_BUILD_TEST=off \
       -DQUIC_BUILD_PERF=off && \
    cmake --build build/linux/openssl3  --config Release && \
    cmake --install build/linux/openssl3 --prefix /msquic


ENTRYPOINT ["top"]

2、使用buildx 编译

x64

C#
docker buildx build -f C:\Users\snltty\Desktop\Dockerfile-msquic --platform="linux/x86_64"  --force-rm -t "snltty/msquic-x64" .

arm64

C#
docker buildx build -f C:\Users\snltty\Desktop\Dockerfile-msquic --platform="linux/arm64"  --force-rm -t "snltty/msquic-arm64" .

编译过程时间不短,但也不会很久,耐心等待,编译成功的话,差不多就下面这个样子

3、运行容器,把编译好的msquic弄出来

/tmp/msquic/artifacts/bin/linux/openssl3 下的 libmsquic.so 弄出来,你的项目可以拿去使用了

4、在Alpine中使用编译的msquic

需要注意的是,需要安装 numactl-dev 库,才能正确使用这个libmsquic.so,可以按照下面的方式安装

C#
ENV TZ=Asia/Shanghai DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
RUN echo "https://mirrors.ustc.edu.cn/alpine/latest-stable/main/" > /etc/apk/repositories \
    && apk add --no-cache libstdc++ libintl tzdata zeromq bash net-tools iproute2 numactl-dev \
    && ln -snf /usr/share/zoneinfo/$clTZ /etc/localtime \
    && echo $TZ > /etc/timezone