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