子目录中的Dockerfile导致构建上下文异常之外的禁止路径

Gee*_*ekn 1 docker dockerfile

我正在尝试将 dockerfile 放在我的主启动项目的子目录中AppMainAppMain有一个名为AppDependency. 当 dockerfile 在 的根目录中时AppMain,一切正常,但是当它嵌套在 的子目录中时AppMain,它会失败

4>Step 5/20 : COPY ["AppMain/AppMain.csproj", "AppMain/"]
4>COPY failed: stat /var/lib/docker/tmp/docker-builder453314675/AppMain/AppMain.csproj: no such file or directory
Run Code Online (Sandbox Code Playgroud)

所以这对我来说很有意义,因为它嵌套在一个子目录中,所以我只是在 COPY 命令前面添加了一个“../”,但这会导致以下上下文异常:

4>COPY failed: Forbidden path outside the build context: ../AppMain/AppMain.csproj ()
Run Code Online (Sandbox Code Playgroud)

好吧,这也是有道理的,因为 docker 文档指出上下文从 dockerfile 所在的位置开始,但这让我提出了真正的问题。

  1. 如果它不能复制到 dockerfile 所在的位置之外,并且当它位于 AppMain 的根目录中时它可以工作,那么为什么在复制AppReference显然位于 docker文件所在位置之上和上下文之外的项目时它不会失败,因为它必须上升一个目录,然后下降到AppReference项目?
  2. 有没有办法实现将 dockerfile 嵌套在子目录中?

下面列出了整个 docker 文件。

FROM mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["AppMain/AppMain.csproj", "AppMain/"]
COPY ["AppReference/AppReference.csproj", "AppReference/"]
RUN dotnet restore "AppMain/AppMain.csproj"
COPY . .
WORKDIR "/src/AppMain"
RUN dotnet build "AppMain.csproj" -c Release -o /app

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "AppMain.dll"]
Run Code Online (Sandbox Code Playgroud)

atl*_*ine 6

用于docker build -t xxx .在子目录中构建时,只有其中的内容.会提交给 docker daemon for docker build. 父文件夹中的东西将无法提交给 docker 引擎进行构建。

因此,您需要使用 将执行目录移回父文件夹cd ..,然后使用 next 构建,然后.它将现在是父文件夹的内容发送到引擎(但您现在需要指定 dockerfile,像这样

docker build -t xxx -f ./YOUR_Subdirectory/Dockerfile .
Run Code Online (Sandbox Code Playgroud)