Popular blog tags

在 Windows 10 上开发 C#,手工制作 Linux Docker 镜像(amd64,Ubuntu 22.04)

Published

 

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"]