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

如何将Visual Studio中ASP.NET Core项目构建为Docker镜像并部署到Linux主机

ASP.NET Core Web API Docker镜像构建与离线部署问题

问题描述

已被困数日,无法为ASP.NET Core Web API项目创建Docker镜像。项目在Visual Studio中运行正常,但希望构建镜像部署到另一台Linux Docker主机。注意到Visual Studio会映射本地Windows文件夹到项目路径,但没有Docker Hub或其他镜像仓库,打算构建镜像后导入到本地安装Docker的Linux主机中。疑惑Docker镜像是否应包含项目所有内容?该如何实现这一目标?已尝试过不同的Dockerfile,但仍需要帮助理解整个流程。

提供的Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
#ENV ASPNETCORE_URLS=http://+:5000
USER app
WORKDIR /app
EXPOSE 5000

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
#ARG PASSWORD_ENV_SEEDED
WORKDIR /src
COPY ["src/API/API.csproj", "src/API/"]
COPY ["src/Application/Application.csproj", "src/Application/"]
COPY ["src/Domain/Domain.csproj", "src/Domain/"]
COPY ["src/Shared/Shared.csproj", "src/Shared/"]
COPY ["src/Client/Client.csproj", "src/Client/"]
COPY ["src/Client.Infrastructure/Client.Infrastructure.csproj", "src/Client.Infrastructure/"]
COPY ["src/Infrastructure/Infrastructure.csproj", "src/Infrastructure/"]
RUN dotnet restore "./src/API/./API.csproj"
COPY . .
WORKDIR "/src/API"
RUN dotnet build "./API.csproj" -c Release -o /app/build
#generate the cert, define the path to store it and password to use
#RUN dotnet dev-certs https -ep /https/aspnetapp.pfx -p ${PASSWORD_ENV_SEEDED}

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
#COPY --chmod=0755 --from=build /https/* /https/
ENTRYPOINT ["dotnet", "ApplicationName.API.dll"]

Visual Studio生成的Docker-Compose文件

version: '3.4'

services:
  kemcalapp:
    image: ${DOCKER_REGISTRY-}app
    build:
      context: .
      dockerfile: src\API\Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "5000:5000"
    restart: on-failure
    container_name: APP

解答

关于Docker镜像内容的疑惑

Docker镜像不需要包含项目所有源文件,你的Dockerfile采用了多阶段构建,最终镜像仅包含运行ASP.NET Core应用所需的发布文件(编译后的dll、依赖库、配置文件等),源文件只在build阶段用于编译,不会进入最终镜像,这样能有效减小镜像体积,提升安全性。

完整流程实现步骤

  1. 修正Dockerfile细节

    • 检查最后一行ENTRYPOINT中的ApplicationName.API.dll,需替换为你的项目实际生成的dll文件名(比如项目名为API,通常是API.dll)。
    • 如果部署时需要HTTPS,可取消注释证书生成相关代码,但注意在Linux环境下可能需要调整证书挂载或配置方式。
  2. 在Windows主机构建镜像
    打开命令行,进入项目根目录(即docker-compose.yml所在的目录),执行以下命令:

    docker build -t my-api-image:v1 -f src/API/Dockerfile .
    
    • -t my-api-image:v1:为镜像添加标签,方便后续识别;
    • -f src/API/Dockerfile:指定Dockerfile路径;
    • .:指定构建上下文为当前目录。
  3. 导出镜像为本地文件
    构建完成后,将镜像导出成tar包:

    docker save -o my-api-image.tar my-api-image:v1
    
  4. 传输镜像到Linux主机
    使用scp或其他文件传输工具,将my-api-image.tar传到目标Linux主机,例如:

    scp my-api-image.tar username@linux-host-ip:/home/username/
    
  5. 在Linux主机导入镜像
    登录Linux主机,进入tar包所在目录,执行导入命令:

    docker load -i my-api-image.tar
    
  6. 在Linux主机运行容器
    执行以下命令启动容器:

    docker run -d -p 5000:5000 --name my-api-container -e ASPNETCORE_ENVIRONMENT=Production my-api-image:v1
    
    • -d:后台运行容器;
    • -p 5000:5000:映射主机端口5000到容器端口5000;
    • -e ASPNETCORE_ENVIRONMENT=Production:设置环境变量为生产环境(根据需求调整);
    • --name my-api-container:为容器指定名称。

多阶段构建流程说明

你的Dockerfile分为四个阶段:

  • base阶段:基于.NET 8运行时镜像,创建非root用户,设置工作目录,暴露端口,为最终运行环境做准备;
  • build阶段:基于.NET 8 SDK镜像,复制项目csproj文件执行restore,再复制所有源文件进行编译;
  • publish阶段:将编译后的项目发布到指定目录,生成可部署的应用文件;
  • final阶段:从base镜像开始,复制publish阶段的发布文件,设置启动命令,形成最终可运行的镜像。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:33:16