# AotAnywhere cross-links both Alpine architectures on the native amd64 runner. ARG NATIVEAOT_BUILDER_IMAGE=localhost/moshiro-dotnet10-nativeaot-aotanywhere:ci FROM --platform=linux/amd64 ${NATIVEAOT_BUILDER_IMAGE} AS build WORKDIR /src/backend COPY restore/backend/ ./ ARG NODE_RID=linux-musl-x64 ENV NUGET_PACKAGES=/root/.nuget/packages RUN dotnet restore agent/src/MoShiro.Agent -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true \ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 \ -p:InvariantGlobalization=true --artifacts-path /artifacts \ && dotnet restore fleet/tools/fleet-enroll -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true \ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 -p:InvariantGlobalization=true \ --artifacts-path /artifacts COPY source/backend/ ./ COPY source/packaging/native/msquic/ /src/packaging/native/msquic/ # 构建信息:CI 通过 --build-arg 传入;不传就是空(放在 restore 之后,每次构建都变的时间不会让依赖还原的缓存失效) ARG MOSHIRO_TAG= ARG MOSHIRO_COMMIT= ARG MOSHIRO_BUILT_AT= ENV MOSHIRO_TAG=$MOSHIRO_TAG MOSHIRO_COMMIT=$MOSHIRO_COMMIT MOSHIRO_BUILT_AT=$MOSHIRO_BUILT_AT RUN dotnet publish agent/src/MoShiro.Agent -m:3 -c Release -r "$NODE_RID" \ --self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 \ -p:InvariantGlobalization=true -p:UseAppHost=true -p:StripSymbols=true \ -p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/agent \ && dotnet publish fleet/tools/fleet-enroll -m:3 -c Release -r "$NODE_RID" \ --self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \ -p:StaticMsQuic=true -p:StaticExecutable=true -p:RuntimeFrameworkVersion=10.0.12 -p:InvariantGlobalization=true \ -p:UseAppHost=true -p:StripSymbols=true \ -p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/enroll \ && rm -rf /artifacts RUN test -x /out/agent/moshiro-agent && test -x /out/enroll/fleet-enroll \ && test "$(stat -c%s /out/agent/moshiro-agent)" -gt 2000000 \ && test "$(stat -c%s /out/enroll/fleet-enroll)" -gt 2000000 \ && ! readelf -l /out/agent/moshiro-agent | grep -q INTERP \ && ! readelf -d /out/agent/moshiro-agent 2>&1 | grep -q NEEDED \ && ! readelf -l /out/enroll/fleet-enroll | grep -q INTERP \ && ! readelf -d /out/enroll/fleet-enroll 2>&1 | grep -q NEEDED FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-alpine ARG APP_VERSION=main LABEL org.opencontainers.image.title="MoShiro Agent" \ org.opencontainers.image.description="MoShiro node agent for Linux" \ org.opencontainers.image.licenses="Apache-2.0" \ org.opencontainers.image.version="$APP_VERSION" COPY --chown=1654:1654 --from=build /out/agent/moshiro-agent /usr/local/bin/moshiro-agent COPY --chown=1654:1654 --from=build /out/enroll/fleet-enroll /usr/local/bin/fleet-enroll COPY --chown=1654:1654 config/ /etc/moshiro/ COPY --chown=1654:1654 --chmod=0755 entrypoint.sh /usr/local/bin/moshiro-entrypoint USER 1654:1654 WORKDIR /etc/moshiro VOLUME ["/etc/moshiro"] ENTRYPOINT ["/usr/local/bin/moshiro-entrypoint"] CMD ["--config", "/etc/moshiro/agent.json"]