Windows 10 写 C# project→ dotnet publish linux-x64 → Ubuntu 22.04 Dockerfile → amd64 镜像
项目结构
MyApp/
├─ MyApp.csproj
├─ Program.cs
├─ Dockerfile
└─ bin/Release/net8.0/linux-x64/publish/
└─ MyApp
用 自包含 Linux 版本
这样 Docker 镜像 不依赖宿主 .NET Runtime,最稳
dotnet publish \
-c Release \
-r linux-x64 \
--self-contained true \
/p:PublishSingleFile=true \
/p:PublishTrimmed=false
output
bin/Release/net8.0/linux-x64/publish/
Dockerfile
# ===============================
# build stage - build 阶段
# ===============================
# 使用 官方 .NET SDK 镜像,SDK 镜像里已经有:dotnet MSBuild NuGet,不用自己装;jammy = Ubuntu 22.04;AS build:给这个阶段起名
FROM mcr.microsoft.com/dotnet/sdk:8.0-jammy AS build
# 容器内当前工作目录是 /src,相当于cd /src
WORKDIR /src
# 把 整个项目源码 拷贝进容器;如果没有 .dockerignore,bin/ obj/ 都会进来,CI 会非常慢
COPY . .
RUN dotnet publish \
-c Release \
-r linux-x64 \
--self-contained true \
-o /out
# ===============================
# runtime stage - build 阶段
# ===============================
# 运行环境
FROM ubuntu:22.04
# 禁止 apt 弹交互式界面,否则zdata 安装卡住 CI,构建永远不结束
ENV DEBIAN_FRONTEND=noninteractive
# 运行的时候目录,程序、配置、日志都会在这里
WORKDIR /app
# 更新软件源索引;HTTPS 访问必需ca-certificates;时区支持tzdata
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ca-certificates \
tzdata \
&& rm -rf /var/lib/apt/lists/* # 清理缓存,否则镜像会大 30–50MB
# 从 build 阶段拷贝 /out 到当前 /app,不带源码,只带运行文件
COPY --from=build /out .
# 给可执行权限
RUN chmod +x ./MyApp
# 容器默认用 5000 端口,映射要用 -p
EXPOSE 5000
# 容器启动即执行
ENTRYPOINT ["./MyApp"]
