方案一:本地构建 Tar 包 + SCP 上传
场景:Windows/Mac 开发机,远程 Linux 服务器,本地无 Docker
使用 ContainerArchiveOutputPath 参数直接输出 .tar.gz 文件。
dotnet publish Netnr.Proxy/Netnr.Proxy.csproj \
-c Release \
-r linux-x64 \
/t:PublishContainer \
--self-contained true \
-p:PublishSingleFile=true \
-p:PublishTrimmed=true \
-p:TrimMode=partial \
-p:ContainerArchiveOutputPath=bin/Release/x-linux-x64/netnr-proxy.tar.gz
上传 Tar 包到远程服务器
scp Netnr.Proxy/bin/Release/x-linux-x64/netnr-proxy.tar.gz root@local.host:/tmp/netnr-proxy.tar.gz
清理旧容器并加载新镜像
docker stop nproxy -t 0; \
docker rm nproxy; \
docker rmi netnr/proxy:latest; \
docker load -i /tmp/netnr-proxy.tar.gz && \
rm -f /tmp/netnr-proxy.tar.gz
启动新容器
docker run -d -p 7718:7718 --name nproxy netnr/proxy:latest
方案二:Docker CLI SSH Context 直连
场景:局域网内高速连接或镜像体积非常小,本地有 Docker CLI (非容器服务)
https://download.docker.com/win/static/stable/x86_64/
配置 Docker Context (一次性设置)
docker context create remote-host --docker host=ssh://root@local.host
docker context use remote-host
直接发布并推送到远程 Daemon
dotnet publish Netnr.Proxy/Netnr.Proxy.csproj \
-c Release \
-r linux-x64 \
/t:PublishContainer \
--self-contained true \
-p:PublishSingleFile=true \
-p:PublishTrimmed=true \
-p:TrimMode=partial
附
.csproj 项目配置文件
<PropertyGroup>
<ContainerFamily>noble-chiseled</ContainerFamily>
<ContainerUser>root</ContainerUser>
<ContainerImageName>netnr/proxy</ContainerImageName>
<ContainerImageTag>latest</ContainerImageTag>
</PropertyGroup>
<ItemGroup Label="Container">
<ContainerPort Include="7718" Type="tcp" />
<ContainerFileExclusion Include="**/*.dbg" />
<ContainerEnvironmentVariable Include="TZ" Value="Asia/Shanghai" />
<ContainerEnvironmentVariable Include="ASPNETCORE_URLS" Value="http://+:7718" />
<ContainerEnvironmentVariable Include="Urls" Value="http://+:7718" />
</ItemGroup>
建议配置 SSH Key 免密登录,以便在 CI/CD 流水线或脚本中自动化执行 scp 和 ssh 命令。