当dockerfile在项目内的文件夹中,且该解决方案包含多个项目时,运行docker。
当dockerfile在项目内的文件夹中,且该解决方案包含多个项目时,运行docker。
这个问题已经有答案:
我给dot.net core应用程序添加了docker支持,结果如下所示:
#请参阅https://aka.ms/containerfastmode了解Visual Studio如何使用此Dockerfile构建您的图像,以进行更快的调试。
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:
如果我在复制命令之后更改项目的某些引用,并从所有项目所在的目录外运行docker,我会得到数千个错误,这些错误与我的解决方案有关。这些错误涉及缺少的东西(程序集和软件包),好像所有项目对彼此都不知道,而实际上它们应该相互引用,就像在通过Visual Studio启动项目时一样。
这是我遵循的一个解决方案的例子,它没有起作用。
https://www.jamestharpe.com/docker-include-files-outside-build-context/
在运行我的项目时,最好实现哪个解决方案?
更新
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
请注意您的COPY
指令。第一个位置是您的物理位置,而另一个是容器内的位置。显然,您正在尝试创建以下目录树:
| 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
同一级别的位置,但您也可以将其放置到其他位置 🙂