Skip to content

Commit 71d0efb

Browse files
author
松鼠
committed
update dockerfile add workfilows 根据tag自动构建镜像
1 parent c78bda4 commit 71d0efb

2 files changed

Lines changed: 99 additions & 14 deletions

File tree

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: Build and Publish Docker Image
2+
3+
# 触发条件:当你推送以 'v' 开头的 Tag 时触发 (例如: v1.0.0)
4+
on:
5+
push:
6+
tags:
7+
- 'v0.9'
8+
9+
env:
10+
REGISTRY: ghcr.io
11+
12+
jobs:
13+
build-and-push:
14+
runs-on: ubuntu-latest
15+
16+
# 允许 GITHUB_TOKEN 推送镜像到 ghcr.io
17+
permissions:
18+
contents: read
19+
packages: write
20+
21+
steps:
22+
- name: Checkout repository
23+
uses: actions/checkout@v4
24+
25+
# 最佳实践:设置 Docker Buildx,支持高级特性和外部缓存
26+
- name: Set up Docker Buildx
27+
uses: docker/setup-buildx-action@v3
28+
29+
# 自动登录到 GitHub Container Registry
30+
- name: Log in to the Container registry
31+
uses: docker/login-action@v3
32+
with:
33+
registry: ${{ env.REGISTRY }}
34+
username: ${{ github.actor }}
35+
password: ${{ secrets.GITHUB_TOKEN }}
36+
37+
# 【关键修复】:将仓库名转换为全小写
38+
# GitHub 仓库名是 SharpFort/SharpFort.Net,但 Docker 镜像名严格要求全小写
39+
- name: Downcase IMAGE_NAME
40+
run: |
41+
echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV}
42+
43+
# 自动提取 Tag 并同时生成 latest 标签
44+
- name: Extract metadata (tags, labels) for Docker
45+
id: meta
46+
uses: docker/metadata-action@v5
47+
with:
48+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
49+
tags: |
50+
type=ref,event=tag
51+
type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }}
52+
53+
# 编译并推送镜像
54+
- name: Build and push Docker image
55+
uses: docker/build-push-action@v5
56+
with:
57+
context: .
58+
file: ./Dockerfile
59+
push: true
60+
tags: ${{ steps.meta.outputs.tags }}
61+
labels: ${{ steps.meta.outputs.labels }}
62+
# 【最佳实践】:弥补 Dockerfile 中 COPY . . 带来的缓存失效问题
63+
# 将构建缓存导出到 GitHub Actions 缓存中,极大加速后续依赖还原的速度
64+
cache-from: type=gha
65+
cache-to: type=gha,mode=max

Dockerfile

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,58 @@
1+
# ==========================================
12
# 1. 运行环境阶段 (Base)
2-
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
3+
# ==========================================
4+
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
5+
# 切换到 root 用户以配置文件系统和时区
36
USER root
47
# 设置时区为亚洲/上海
58
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
69
echo "Asia/Shanghai" > /etc/timezone
10+
11+
# 【最佳实践】:配置完系统环境后,务必降级为非特权用户 app,防止容器逃逸风险
12+
USER app
713
WORKDIR /app
14+
15+
# 暴露 19001 端口 (你提到 19001 端口未被占用)
816
EXPOSE 19001
17+
ENV ASPNETCORE_HTTP_PORTS=19001
918

19+
# ==========================================
1020
# 2. 编译构建阶段 (Build)
11-
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
21+
# ==========================================
22+
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
1223
ARG BUILD_CONFIGURATION=Release
1324
WORKDIR /src
1425

15-
# 拷贝所有项目文件以进行 Restore (利用层缓存优化)
16-
COPY ["Yi.Abp.sln", "./"]
17-
COPY ["common.props", "./"]
26+
# 拷贝全局配置文件 (利用层缓存优化)
27+
COPY ["Sf.Abp.sln", "./"]
28+
COPY["common.props", "./"]
1829
COPY ["usings.props", "./"]
1930
COPY ["version.props", "./"]
2031

21-
# 自动查找并拷贝所有 .csproj 文件
22-
# 注意:这一步为了性能手动列出核心模块,或保持 COPY . .
2332
# 针对本项目的多层级结构,直接拷贝全部源代码
33+
# (虽然会牺牲一部分 Docker 本地层缓存,但我们会在 GitHub Actions 中用外部缓存弥补)
2434
COPY . .
2535

2636
# 执行还原
27-
RUN dotnet restore "src/Yi.Abp.Web/Yi.Abp.Web.csproj"
37+
RUN dotnet restore "src/Sf.Abp.Web/Sf.Abp.Web.csproj"
2838

29-
# 执行发布
30-
WORKDIR "/src/src/Yi.Abp.Web"
31-
RUN dotnet publish "Yi.Abp.Web.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
39+
# 执行编译
40+
WORKDIR "/src/src/Sf.Abp.Web"
41+
RUN dotnet build "Sf.Abp.Web.csproj" -c $BUILD_CONFIGURATION -o /app/build
3242

33-
# 3. 最终镜像阶段 (Final)
43+
# ==========================================
44+
# 3. 发布阶段 (Publish)
45+
# 【修复点】:增加独立的 publish 阶段,修复原代码 COPY --from 找不到阶段的 Bug
46+
# ==========================================
47+
FROM build AS publish
48+
RUN dotnet publish "Sf.Abp.Web.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
49+
50+
# ==========================================
51+
# 4. 最终镜像阶段 (Final)
52+
# ==========================================
3453
FROM base AS final
3554
WORKDIR /app
3655
COPY --from=publish /app/publish .
37-
# 默认启动 Yi.Abp.Web 模块
38-
ENTRYPOINT ["dotnet", "Yi.Abp.Web.dll"]
56+
57+
# 默认启动 Sf.Abp.Web 模块
58+
ENTRYPOINT ["dotnet", "Sf.Abp.Web.dll"]

0 commit comments

Comments
 (0)