如何将ASP.NET Core 2.0应用程序Docker化?

14

我有一个简单的ASP.NET Core 2.0应用程序,解决方案中包含两个项目。一个项目是类库(WorldLibrary.dll),被Web应用程序(WeatherWeb.dll)引用。

我已经尝试按照这里的步骤进行操作:

https://docs.docker.com/engine/examples/dotnetcore/

这是我的Dockerfile:

FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "WeatherWeb.dll"]

但是,所引用的 .dll 存在问题。我从 "docker build" 命令中获得以下输出:

C:\Users\olavt\source\repos\Weather\WeatherWeb>docker build -t weather .
Sending build context to Docker daemon  6.398MB
Step 1/10 : FROM microsoft/aspnetcore-build:2.0 AS build-env
 ---> df4c9af52c86
Step 2/10 : WORKDIR /app
 ---> Using cache
 ---> ae9d1b099da7
Step 3/10 : COPY *.csproj ./
 ---> Using cache
 ---> 2d9f3fba6470
Step 4/10 : RUN dotnet restore
 ---> Using cache
 ---> 19af5fb355a3
Step 5/10 : COPY . ./
 ---> 1704520a3ced
Step 6/10 : RUN dotnet publish -c Release -o out
 ---> Running in 7bcdf847e4dc
/usr/share/dotnet/sdk/2.0.2/NuGet.targets(792,5): warning MSB3202: The project file "/WorldLibrary/WorldLibrary.csproj" was not found. [/app/WeatherWeb.csproj]
Microsoft (R) Build Engine version 15.4.8.50001 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

/usr/share/dotnet/sdk/2.0.2/Microsoft.Common.CurrentVersion.targets(1768,5): warning : The referenced project '../WorldLibrary/WorldLibrary.csproj' does not exist. [/app/WeatherWeb.csproj]
Controllers/Api/WeatherController.cs(6,7): error CS0246: The type or namespace name 'WorldLibrary' could not be found (are you missing a using directive or an assembly reference?) [/app/WeatherWeb.csproj]
Controllers/WeatherController.cs(6,7): error CS0246: The type or namespace name 'WorldLibrary' could not be found (are you missing a using directive or an assembly reference?) [/app/WeatherWeb.csproj]
Controllers/Api/WeatherController.cs(14,39): error CS0246: The type or namespace name 'Weather' could not be found (are you missing a using directive or an assembly reference?) [/app/WeatherWeb.csproj]
The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 1

C:\Users\olavt\source\repos\Weather\WeatherWeb>

我该如何正确地复制所需的 .dll 文件?


1
项目模板已经包含了添加 Docker 支持的选项。你试过了吗? - Panagiotis Kanavos
1
您还可以从“项目”菜单中添加Docker支持,选择“Docker支持”。 - Panagiotis Kanavos
2个回答

9

如果涉及相关项目,则必须对解决方案文件运行dotnet restoredotnet publish,并将您的Docker文件放置在解决方案级别,以便您可以从中访问所有项目。

基本上,您需要在Docker文件中进行的唯一更改是:

COPY *.sln ./
COPY ./your_proj1_folder/*.csproj ./your_proj1_folder/
COPY ./your_proj2_folder/*.csproj ./your_proj2_folder/
RUN dotnet restore

3
ASP.NET Core项目模板包含一个选项,可以添加Docker支持,并且可以选择目标为Linux或Windows容器。
即使您创建的ASP.NET Core Web应用程序没有Docker支持,您也可以从“项目> Docker支持”菜单将其添加到现有项目中。
生成的Dockerfile定义了基础镜像,执行dotnet restore、build、publish步骤,并创建运行Web应用程序的最终镜像。
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY WebApplication1/WebApplication1.csproj WebApplication1/
RUN dotnet restore
COPY . .
WORKDIR /src/WebApplication1
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

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

它还生成一个docker-compose.yml文件,描述您想要部署的镜像。在此示例中,我添加了两个Web应用程序。第一个是使用Docker支持创建的。在第二个中,稍后添加了Docker支持。 docker-compose.yml文件包括两者:
version: '3'

services:
  webapplication1:
    image: webapplication1
    build:
      context: .
      dockerfile: WebApplication1\Dockerfile

  webapplication2:
    image: webapplication2
    build:
      context: .
      dockerfile: WebApplication2\Dockerfile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接