当前位置: 首页 > 知识库问答 >
问题:

当dockerfile位于项目内的文件夹中且解决方案包括多个项目时运行docker[duplicate]

魏安然
2023-03-14

我向Dot.NET核心应用程序添加了docker支持,这就是我得到的

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["SMSys.csproj", ""]
COPY ["../DataLayer/DataLayer.csproj", "../DataLayer/"]
COPY ["../Utilities/Utilities.csproj", "../Utilities/"]
COPY ["../ServiceLayer/ServiceLayer.csproj", "../ServiceLayer/"]
RUN dotnet restore "./SMSys.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "SMSys.csproj" -c Release -o /app/build

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

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

我的docker文件在'smsys.csproj'所在的位置。

如果我在该目录中运行docker,我会得到:

COPY failed: forbidden path outside the build context:

如果我在执行copy命令后更改项目的一些引用,并从我所有项目所在的目录外部运行docker,那么我将得到与我的解决方案相关的上千个错误。错误与丢失的东西(程序集和包)有关,好像所有的项目都彼此忽略了,而实际上它们应该彼此很好地引用,就像我通过visual Studio启动项目时所做的那样。

    FROM mcr.microsoft.com/dotnet/aspnet:5.0.3-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

 
FROM mcr.microsoft.com/dotnet/sdk:5.0.103-buster-slim AS build 
WORKDIR /src 

# Prevent 'Warning: apt-key output should not be parsed (stdout is not a terminal)'
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1

# install NodeJS 13.x
# see https://github.com/nodesource/distributions/blob/master/README.md#deb
RUN apt-get update -y
RUN apt-get upgrade -y
RUN apt-get install -y mc
#RUN apt-get install curl gnupg -yq 
#RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y npm
 
COPY ["SMSysSolution/SMSys.csproj", "SMSysSolution/"]
COPY ["DataLayer/DataLayer.csproj", "DataLayer/"]
COPY ["Utilities/Utilities.csproj", "Utilities/"]
COPY ["ServiceLayer/ServiceLayer.csproj", "ServiceLayer/"]
COPY ["XUnitIntegrationTests/XUnitIntegrationTests.csproj", "XUnitIntegrationTests/"]
COPY ["XUnitTestProject1/XUnitTestProject1.csproj", "XUnitTestProject1/"]
RUN dotnet restore "./SMSysSolution/SMSys.csproj"
COPY . .
WORKDIR "/src/SMSysSolution"
RUN dotnet build "SMSys.csproj" -c Release -o /app/build

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

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

我必须对路径做一些改动才能使它正常工作。

共有1个答案

欧阳楚
2023-03-14

DockerFile

请注意您的复制说明。第一个位置是您的物理位置,而另一个是容器内的位置。显然,您正在尝试创建这样的树:

| src
  | SMSys.csproj
| DataLayer
  | ...
| Utilities
  | ...
| ...

我不确定这是不是你想要的...

FROM mcr.microsoft.com/dotnet/aspnet:5.0.3-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0.103-buster-slim AS build
WORKDIR /src
COPY ["{FOLDER OF THE SMSys.csproj}/SMSys.csproj", "{MATCHING FOLDER OF THE SMSys.csproj}/"]
COPY ["DataLayer/DataLayer.csproj", "DataLayer/"]
COPY ["Utilities/Utilities.csproj", "Utilities/"]
COPY ["ServiceLayer/ServiceLayer.csproj", "ServiceLayer/"]
RUN dotnet restore "./SMSys.csproj"
COPY . .
WORKDIR "/src/{FOLDER OF THE SMSys.csproj}"
RUN dotnet build "SMSys.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SMSys.dll"]
| src
  | {FOLDER OF THE SMSys.csproj}
    | SMSys.csproj
  | DataLayer
    | ...
  | Utilities
    | ...
  | ...
| docker-compose.yaml
| {FOLDER OF THE SMSys.csproj}
| DataLayer
| Utilities
| ...

然后,在文件内部:

services:
    smsys-app:
        ports:
           - "..." # ports of the services
        build:
            context: .
            dockerfile: {FOLDER OF THE SMSys.csproj}/Dockerfile

这是假设您将DockerFile保持在smsys.csproj的同一级别,但您可以将其放在另一个位置:)

 类似资料:
  • 问题内容: 当您有一个用于数据库的Dockerfile,一个用于应用程序服务器的Dockerfile等时,如何组织属于项目的Dockerfile?您是否在源代码中创建了某种层次结构?一个大型企业项目不能仅由一个Dockerfile组成吗? 问题答案: 这个答案已经过时了。无花果不再存在,已经被Dockercompose取代。

  • 我已经安装并配置了SonarQube 3.7.1和sonar runner 2.3。 在尝试用c#解决方案运行sonar runner时,我遇到了一个错误: 我的声纳项目。房产看起来像 我想排除项目MPA. Build。但它不工作。 在MPA。sln将MPA归档。构建项目定义为 项目(“{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}”)=“MPA.Build”、“MP

  • 问题内容: 我正在尝试创建由4个项目组成的ASP.NET 5解决方案的映像。结构如下: FlashTools(ASP.NET 5类库) 模型(ASP.NET 5类库) QuizzCorrector(ASP.NET 5 Web应用程序) QuizzService(ASP.NET 5类库) 我有一个简单的Dockerfile,看起来像这样: 但不确定放在哪里。在我的解决方案的根文件夹中global.j

  • 我看过这个答案: 编辑。csproj文件并更正解决方案文件夹(包含packages文件夹)的相对路径为我解决了这个问题。 但是我不知道该编辑什么。 我正在Visual Studio 2013中制作一个C项目。我有一个包含三个项目的解决方案。其中一个项目需要Nuget包。 我在我的解决方案上使用Manage NuGet软件包来安装NuGet包。从那里我选择了一个需要这个包的项目。我还使用了Enabl

  • PROJECT_B中的docker-compose.yml如下所示: 每个项目都可以单独运行,工作良好。但是,如果我们想要更改PROJECT_A和PROJECT_B之间的api,我们需要运行这两个项目,并将它们链接在一起以测试我们的代码。现在我们想写一个开发工具包项目,可以运行这两个项目,并链接他们,如果需要。最好的方法是什么?

  • 本文向大家介绍docker运行项目的方法,包括了docker运行项目的方法的使用技巧和注意事项,需要的朋友参考一下 1、进入存放自己项目war的目录 编辑Dockerfile文件 内容如下: 2、build自己的镜像 不出意外的会显示build镜像的步骤,最后一行为 最后的字符串是镜像id的一部分。 此时可以运行docker images查看自己的镜像信息 3、运行自己的docker容器 这里 -