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

GitLab Runner Shell执行器找不到.csproj文件的部署问题排查

问题:GitLab CI/CD Shell Runner构建Docker镜像时找不到.csproj文件

作为.NET开发者,基于WeatherForecast模板创建Web应用,计划通过包含build、test、deploy三阶段的GitLab CI/CD流程部署。最初在GitLab服务器运行GitLab Runner,通过SSH密钥连接构建服务器传输文件;后因安全因素,将GitLab Runner安装到已配备Docker、docker-compose、dotnet-npm等工具的构建服务器,并注册了Shell类型的Runner。但执行Docker镜像构建时,Dockerfile无法找到.csproj文件,无法定位执行器的文件查找路径,请求协助排查。

我的Dockerfile(Visual Studio生成)

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

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

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Test/Test.csproj", "Test/"]
RUN dotnet restore "Test/Test.csproj"
COPY . .
WORKDIR "/src/Test"
RUN dotnet build "Test.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Test.csproj" -c Release -o /app/publish

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

我的GitLab CI/CD配置文件

image: mcr.microsoft.com/dotnet/sdk:latest

stages:   
  - build
  - test
  - deploy
before_script:  
  - dotnet restore Test.sln

build:
  stage: build

  tags: 
    - dev

  script:
    - 'dotnet build --no-restore Test.sln'

tests:
  stage: test

  tags: 
    - dev
  script:
    - 'dotnet test --no-restore Test.sln'

deploy: 
  stage: deploy
  environment: production
  
  tags:
    - dev  
  before_script: 
    - cd Test       
  script: 
  - 'docker build - < Dockerfile'

问题原因及解决方法

核心问题

deploy阶段的before_script执行了cd Test,随后用docker build - < Dockerfile的方式构建。这种方式是从标准输入读取Dockerfile内容,但Docker构建上下文是当前的Test目录,而Dockerfile里的COPY ["Test/Test.csproj", "Test/"]会尝试在当前上下文找Test/Test.csproj——但当前已经在Test目录下,实际文件路径是./Test.csproj,因此找不到目标文件。

解决步骤

  1. 调整部署阶段的构建命令(推荐方案)
    去掉before_script里的cd Test,直接以仓库根目录为构建上下文,指定Dockerfile的路径:

    deploy: 
      stage: deploy
      environment: production
      
      tags:
        - dev  
      script: 
        - 'docker build -f Test/Dockerfile -t your-image-tag .'
    

    这里.代表仓库根目录作为构建上下文,-f Test/Dockerfile指定Dockerfile的位置,这样Dockerfile里的COPY ["Test/Test.csproj", "Test/"]就能正确匹配根目录下的Test/Test.csproj文件。

  2. 若坚持在Test目录下构建,修改Dockerfile路径
    如果需要保留cd Test的操作,要修改Dockerfile中的COPY路径,适配当前上下文:

    # 原COPY ["Test/Test.csproj", "Test/"] 修改为
    COPY ["Test.csproj", "./"]
    # 后续的工作目录也需调整
    WORKDIR "/src"
    RUN dotnet build "Test.csproj" -c Release -o /app/build
    

    同时构建命令改为直接使用当前目录的Dockerfile:

    deploy: 
      stage: deploy
      environment: production
      
      tags:
        - dev  
      before_script: 
        - cd Test       
      script: 
        - 'docker build -t your-image-tag .'
    
  3. 验证文件结构(排查辅助)
    可以在deploy阶段的script中添加目录查看命令,确认文件位置是否符合预期:

    deploy: 
      stage: deploy
      environment: production
      
      tags:
        - dev  
      script: 
        - pwd
        - ls -la
        - ls -la Test
        - 'docker build -f Test/Dockerfile -t your-image-tag .'
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:01:22