如何将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阶段用于编译,不会进入最终镜像,这样能有效减小镜像体积,提升安全性。
完整流程实现步骤
修正Dockerfile细节
- 检查最后一行ENTRYPOINT中的
ApplicationName.API.dll,需替换为你的项目实际生成的dll文件名(比如项目名为API,通常是API.dll)。 - 如果部署时需要HTTPS,可取消注释证书生成相关代码,但注意在Linux环境下可能需要调整证书挂载或配置方式。
- 检查最后一行ENTRYPOINT中的
在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路径;.:指定构建上下文为当前目录。
导出镜像为本地文件
构建完成后,将镜像导出成tar包:docker save -o my-api-image.tar my-api-image:v1传输镜像到Linux主机
使用scp或其他文件传输工具,将my-api-image.tar传到目标Linux主机,例如:scp my-api-image.tar username@linux-host-ip:/home/username/在Linux主机导入镜像
登录Linux主机,进入tar包所在目录,执行导入命令:docker load -i my-api-image.tar在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
相关产品推荐
相关产品推荐

