当dockerfile在项目内的文件夹中,且该解决方案包含多个项目时,运行docker。

11 浏览
0 Comments

当dockerfile在项目内的文件夹中,且该解决方案包含多个项目时,运行docker。

这个问题已经有答案

如何在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"]

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

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同一级别的位置,但您也可以将其放置到其他位置 🙂

0