2

我在使用旧版 asp.net Web 应用程序手动构建和运行 Windows Server 核心容器时遇到问题。在 Visual Studio 中,我可以使用自动生成的 dockerfile/yml 文件运行容器。

我想使用 dockerfile 而不是 Visual Studio 来执行 docker build 和 docker run powershell 命令。

这是当前的 yml 文件:

version: '3'

services:

  fulldotnetwebapplication:

    image: fulldotnetwebapplication

    build:

      context: .\FullDotNetWebApplication

      dockerfile: Dockerfile

这是当前的 dockerfile:

FROM microsoft/aspnet:4.7.1-windowsservercore-ltsc2016

ARG source

WORKDIR /inetpub/wwwroot

COPY ${source:-obj/Docker/publish} .

假设我的 ASP 项目是 FullDotNetWebApplication,它包含 App_Data、Content、Controllers 等文件夹以及 Master/ASPX 页面以及 web/packages/config。

我为我的 Dockerfile 尝试了这个:

FROM microsoft/aspnet:4.7.1-windowsservercore-ltsc2016

WORKDIR /inetpub/wwwroot

COPY . . 

COPY ./bin ./bin

并收到此错误:

docker : COPY failed: GetFileAttributesEx \\?\C:\Windows\TEMP\docker-builder977521850\bin: The system cannot find the file specified.
At line:1 char:1
+ docker build -t fulldotnetwebapplication .
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (COPY failed: Ge...file specified.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

将此应用程序从 Powershell 部署到 IIS 时,我的 docker 文件应该是什么样子?我不明白 VS 正在做什么魔术来完成这项工作?是在构建应用程序还是正在生成某种部署文件?我可以指出的任何示例或示例 Dockerfile 都会很棒。

4

2 回答 2

0
${source:-obj/Docker/publish}

这就是为什么您可以在 VS 中运行它而不是从 PowerShell/CMD 运行它的原因,VS 会注入该路径的源部分,以将其映射到当前项目的特殊 docker 发布文件夹。

如果将其替换为. .,则意味着将所有内容从我当前的执行目录(如果您未手动指定文件,通常与 dockerfile 位置相同)递归地复制到容器中的工作目录。因此,您的尝试COPY ./bin ./bin是不必要的,因为程序COPY . .已经复制了该目录(假设它确实存在)

是在构建应用程序还是正在生成某种部署文件?

容器是部署单元,不能将容器部署到 IIS,它必须运行在容器主机上。Docker 也不会构建您的解决方案,在构建容器之前您应该构建您的解决方案,然后仅复制所需的输出(这是 VS 源路径试图做的)。

可以让您的容器工作流程也使用多阶段容器构建您的解决方案,您可以使用安装了 VS 的容器来构建项目,然后将输出复制到另一个容器以运行它,但这是一个相当如果您甚至无法正常构建复制工作,我不建议您使用高级设置。

于 2018-02-07T09:45:08.967 回答