You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GitHub Actions部署C#微服务到Digital Ocean K8集群遇镜像构建问题

问题解决方案

一、Docker镜像构建错误(找不到.csproj文件)

错误源于Docker构建上下文路径与Dockerfile中的COPY路径不匹配:你在项目根目录执行docker build并指定Project/Api1/Dockerfile,但Dockerfile中尝试复制的Api1.csproj实际位于Project/Api1/目录下,根目录上下文里不存在该文件,导致构建失败。

修复方案(二选一)

方案1:调整docker build命令的上下文

将构建命令的上下文从根目录(.)改为微服务所在目录(Project/Api1/),让Docker以Project/Api1/作为上下文,即可正确找到Api1.csproj:

- name: Build container image - Api1
  run: docker build -t registry.digitalocean.com/api1:$(echo $GITHUB_SHA | head -c7) -f Project/Api1/Dockerfile Project/Api1/

- name: Build container image - Api2
  run: docker build -t registry.digitalocean.com/api2:$(echo $GITHUB_SHA | head -c7) -f Project/Api2/Dockerfile Project/Api2/

方案2:修改Dockerfile中的路径适配根上下文

若不想调整构建上下文,可修改Dockerfile中的COPY路径指向根目录下的实际文件位置,同时调整后续工作目录:

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
# 调整COPY路径,指向根上下文里的csproj位置
COPY ["Project/Api1/Api1.csproj", "Api1/"]
RUN dotnet restore "./Api1/./Api1.csproj"
# 复制整个根目录到容器/src
COPY . .
# 调整工作目录到项目实际位置
WORKDIR "/src/Project/Api1"
RUN dotnet build "./Api1.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Api1.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Api1.dll"]

二、本地部署ImagePullBackOff状态问题

该状态表示Kubernetes无法拉取镜像,常见原因及解决步骤:

  1. 确认镜像已正确推送至Digital Ocean容器Registry
    • 检查GitHub Actions中是否包含docker push步骤,确保镜像标签与Deployment中使用的标签完全一致(包括$(echo $GITHUB_SHA | head -c7)生成的短SHA值)。
  2. 配置Kubernetes访问私有Registry的凭证
    • Digital Ocean容器Registry需要配置secret才能让Kubernetes拉取私有镜像,执行以下命令创建secret(替换<DO_TOKEN>为你的Digital Ocean访问令牌):
      kubectl create secret docker-registry do-registry \
        --docker-server=registry.digitalocean.com \
        --docker-username=<你的DO用户名> \
        --docker-password=<DO_TOKEN>
      
    • 在Deployment的spec.template.spec.imagePullSecrets中引用该secret:
      spec:
        template:
          spec:
            imagePullSecrets:
              - name: do-registry
            containers:
              - name: api1
                image: registry.digitalocean.com/api1:<镜像标签>
      
  3. 查看Pod事件定位具体错误
    • 执行命令查看Pod的详细事件信息:
      kubectl describe pod <你的Pod名称>
      
    • 根据事件提示处理:比如manifest unknown表示镜像/标签不存在,unauthorized表示凭证配置错误。

内容的提问来源于stack exchange,提问作者matt sharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:03:13