Docker 从一个容器复制到另一个容器

Luk*_*uka 4 asp.net node.js docker dockerfile docker-compose

我有这个泊坞窗文件:

FROM microsoft/aspnetcore:2.0-nanoserver-1709 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0-nanoserver-1709 AS build
WORKDIR /src
COPY *.sln ./
COPY MyApp.Api/MyApp.Api.csproj MyApp.Api/
RUN dotnet restore
COPY . .
WORKDIR /src/MyApp.Api
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
copy --from=build["C:\Program Files\nodejs", "C:\nodejs"]
RUN SETX PATH "%PATH%;C:\nodejs"
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyApp.Api.dll"]
Run Code Online (Sandbox Code Playgroud)

我想将build 上的 nodejs 从 c:\Program Files\nodejs复制到Final 上的 C:\nodejs。但是当我构建它时,我收到此错误:

步骤15/19:复制 --from=publish ["C:\Program Files\nodejs", "C:\nodejs"]

错误:服务“myapp.api”构建失败:无法处理“[\”C:\ Program”:查找匹配双引号时语句意外结束

如何将 NodeJS 从构建映像复制到最终映像?谢谢

Von*_*onC 5

如果copy --from=publish ["C:\\Program Files\\nodejs", "C:\\nodejs"]给出:

ERROR: Service 'myapp.api' failed to build: COPY failed: 
 CreateFile \\?\Volume{acdcd1b2-fe0d-11e7-8a8f-10f00533bf2a}\C:Program Filesnodejs:
Run Code Online (Sandbox Code Playgroud)

尝试双重转义:

copy --from=publish ["C:\\\\Program Files\\\\nodejs", "C:\\\\nodejs"]
Run Code Online (Sandbox Code Playgroud)

或者像这个 Dockerfile 中那样考虑替代语法:

copy --from=publish C:\Program Files\nodejs C:\nodejs
Run Code Online (Sandbox Code Playgroud)

但是,前面提到的 dockerfile确实使用了这两种语法,没有任何问题。例如:

COPY --from=SetupPhase ["C:\\Program Files (x86)\\Microsoft SDKs", "C:\\Program Files (x86)\\Microsoft SDKs"]
Run Code Online (Sandbox Code Playgroud)

但是:确实如此,在之前copy --from

RUN icacls 'C:\\Program Files (x86)\\WindowsPowerShell\\Modules' /reset /t /c /q 
RUN attrib -h -r -s 'C:\\Program Files (x86)\\WindowsPowerShell\\Modules' /s
RUN attrib -h -r -s "C:/Windows" /s
Run Code Online (Sandbox Code Playgroud)

(将这些路径替换为您要访问的路径)

这也许可以解释为什么它可以从另一个 Windows 映像复制:没有访问问题,因为 ACL 已重置。

OP Luka确认:

  1. 添加这些行来构建

    RUN icacls "C:\\Program Files\\nodejs" /reset /t /c /q 
      RUN attrib -h -r -s "C:\\Program Files\\nodejs" /d /s
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 Final 中的复制行编辑为:

    COPY --from=build ["C:\\\\Program Files\\\\nodejs", "/nodejs"]
    
    Run Code Online (Sandbox Code Playgroud)