【问题标题】:An issue with resolving directory names when building a docker container for an asp.net core 3.1 web app为 asp.net core 3.1 Web 应用程序构建 docker 容器时解析目录名称的问题
【发布时间】:2021-09-10 17:14:46
【问题描述】:

Visual Studio 2019 会生成一个 docker 文件,由于应用程序文件夹的结构方式,其 COPY 语句如下所示:

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["MyWebApp/MyWebApp.csproj", "MyWebApp/"]
COPY ["../../core/Logic/Logic.csproj", "../../core/Logic/"]
COPY ["../../core/Models/Models.csproj", "../../core/Models/"]
RUN dotnet restore "MyWebApp/MyWebApp.csproj"
COPY . .
WORKDIR "/src/MyWebApp"
RUN dotnet build "MyWebApp.csproj" -c Release -o /app/build

我在运行 docker compose 命令时不断收到以下错误消息:

=> 错误 [build 4/9] 复制 [../../core/Logic/Logic.csproj, ../../core/Logic/] 0.0s

=> 错误 [build 5/9] 复制 [../../core/Models/Models.csproj, ../../core/Models/]

由于某些原因,我们无法重组 VS 2019 中的文件夹,因为它已以这种方式设置。 docker 文件位于MyWebApp 项目的文件夹中,docker compose 文件位于解决方案所在的MyWebApp 文件夹的父文件夹中。即使我将 docker 文件移到了 docker compose 文件附近,但还没有定论。

以下代码sn -p是docker-compose文件:

version: '3.4'

services:
  mywebapp:
    image: ${DOCKER_REGISTRY-}mywebapp
    build:
      context: .
      dockerfile: MyWebApp/Dockerfile
    ports:
    - 8080:80
    - 8443:443

解决此问题的解决方法或解决方案是什么?

【问题讨论】:

  • 分享你的 docker compose 文件
  • @galdin 我通过反映 docker compose 文件更新了问题。
  • 也分享完整的错误信息...还不如分享文件结构... docker-compose 文件看起来不错.. 如果它无法访问文件,你的答案就在在build.context 中:只有上下文目录中和上下文目录下的文件可以在构建步骤中使用。

标签: visual-studio docker asp.net-core docker-compose


【解决方案1】:

如果你的文件结构是:

docker-compose.yml
MyWebApp/MyWebApp.csproj
core/Logic/Logic.csproj
core/Models/Models.csproj

你的 Dockerfile 应该是:

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["MyWebApp/MyWebApp.csproj", "MyWebApp/"]
COPY ["core/Logic/Logic.csproj", "../../core/Logic/"]
COPY ["core/Models/Models.csproj", "../../core/Models/"]
RUN dotnet restore "MyWebApp/MyWebApp.csproj"
COPY . .
WORKDIR "/src/MyWebApp"
RUN dotnet build "MyWebApp.csproj" -c Release -o /app/build

为什么?

因为当前工作目录始终是context 目录。可以使用 docker-compose 的 build.context 字段设置上下文。在您的示例中,上下文是解决方案根。所以 Dockerfile 是从那个目录执行的,不管它放在哪里。

您无法访问上下文目录之外的文件。
例如。如果上下文解析为/a/b/c,Dockerfile 无法复制或使用/a/b/d 中的文件

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 2019-11-05
    • 2011-02-18
    • 1970-01-01
    • 2021-08-23
    • 2021-06-28
    • 2018-12-07
    • 2020-02-01
    • 2020-12-07
    相关资源
    最近更新 更多