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

当dockerfile位于项目内的文件夹中且解决方案包含多个项目时运行docker,docker,Docker,我在一个.net核心应用程序中添加了docker支持,这就是我得到的 #请参阅,以了解Visual Studio如何使用此Dockerfile构建图像以加快调试 我的docker文件是'SMSys.csproj'所在的位置 如果我在该目录中运行docker,我会得到: COPY failed: forbidden path outside the build context: 如果我在copy命令之后更改了项目的一些引用,并从我所有项目所在的目录之外运行docker,那么我会收到与我的解决方案

我在一个.net核心应用程序中添加了docker支持,这就是我得到的

#请参阅,以了解Visual Studio如何使用此Dockerfile构建图像以加快调试

我的docker文件是'SMSys.csproj'所在的位置

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

COPY failed: forbidden path outside the build context:
如果我在copy命令之后更改了项目的一些引用,并从我所有项目所在的目录之外运行docker,那么我会收到与我的解决方案相关的上千个错误。这些错误与缺少的东西(程序集和包)有关,就好像所有项目都彼此忽略了一样,而事实上它们应该彼此很好地引用,就像我通过VisualStudio启动项目时一样

这是我遵循的一个不起作用的解决方案的示例。

为了通过docker运行我的项目,最好的解决方案是什么

更新

    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"]

我必须对路径进行一些更改才能使其正常工作。

Dockerfile

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

| src
  | SMSys.csproj
| DataLayer
  | ...
| Utilities
  | ...
| ...
我不确定这是否正是你想要的

此外,这些dotnet Docker图像还存在一些问题。您可以尝试使用更新的版本

请尝试执行以下操作:

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
    | ...
  | ...
使用上下文运行Dockerfile

以上面的示例为例,要构建该映像,您必须拥有所有这些文件夹的上下文。例如,在同一级别的文件夹中使用docker命令,或者使用
docker compose
,您必须指定上下文位于文件夹的顶部

例如,按照
docker compose
方法,您可以找到文件,如下所示:

| 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
相同的级别,但您可以将其放在另一个位置:)

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