【问题标题】:Docker: Running dotnet publish -o /output results in a nonzero error on CLIDocker:在 CLI 上运行 dotnet publish -o /output 会导致非零错误
【发布时间】:2017-12-26 20:27:49
【问题描述】:

我使用的是 Ubuntu 16.04 LTS,


Docker-compose v 1.18.0-rc2, build 189468b
Docker version 17.12.0-ce-rc1, build ee2f943

使用 docker 运行此命令:dotnet publish -o /output 会导致此错误:


ERROR: Service 'generator' failed to build: The command '/bin/sh -c 
dotnet publish -c Release -o out' returned a non-zero code: 145

我已经为 Ubuntu 安装了 .NET SDK,但不知道如何解决这个错误;它只是不会创建该发布文件夹;这是 dotnet --info

joel@worker-2:~/workspace/asp (copy)/api$ dotnet --info .NET 命令 线条工具 (2.0.2)

产品信息:版本:2.0.2 提交 SHA-1 哈希: a04b4bf512

运行环境:操作系统名称:ubuntu 操作系统版本:16.04 操作系统 平台:Linux RID:ubuntu.16.04-x64 基本路径:
/usr/share/dotnet/sdk/2.0.2/

Microsoft .NET Core 共享框架主机

版本:2.0.0 构建: e8b8861ac7faf042c87a5c2f9f2d04c98b69f28d

Link to the same question worded differently with more error logs

【问题讨论】:

    标签: asp.net docker .net-core docker-compose docker-for-windows


    【解决方案1】:

    您看到的错误是因为您的项目包含一个 global.json 文件,该文件将所需的 SDK 版本固定为 2.0.2。但是,docker 镜像包含更新的 SDK 版本(当前版本是 2.1.3)。因为你用来构建的 docker 镜像中没有 2.0.2 SDK,所以它只是出错了。

    【讨论】:

    • 这似乎比我的回答更具体。我会在这个答案上打赌 +1。
    • 哦,有趣,谢谢 Martin,让我修改我的 global.json 并再次运行它!
    • @Martin 哦,原来如此,现在可以使用了,非常感谢!!!也感谢 VonC,非常感谢你们俩!不过,快速提问,您是如何得知较新的 2.1.3 的?我怎么能自己发现这一点,以便在更新的 SDK 版本出现时维护我的脚本?你是怎么找到那个版本 2.1.3 的?
    • 哦,您是否打开了与 (FROM microsoft/aspnetcore-build:2 AS build-env) 的 2.0 标记相对应的基本映像的 Dockerfile 以及从该本地 dockerfile 中,看到他们正在执行从 (FROM microsoft/dotnet:2.0.4-sdk-2.1.3-stretch) 拉取?这是您用来确定哪个是当前 SDK 的过程吗?当这些图像从我们脚下切换时,我需要知道这一点才能维护我们的 CI 代码库。最后,您是否建议将这些有效的 SDK 保存到我们自己的私有注册表中,这样我们就不会因为丢失更新而受到此类破坏性更改的影响?
    • 我碰巧关注 .net 核心版本,这类似于 this GitHub issue。除非 global.json 中会有一些“最低版本”支持,否则我建议为每个版本更新它,这样你就不会意外地使用过时的工具构建或删除文件并让你的工具在所有机器上保持最新。
    【解决方案2】:

    首先,如果您使用的是 Ubuntu,则 docker for Windows 不相关。

    我看到 dotnet publish -c Release -o out 用于“Dockerize a .NET Core application”(以及 repo dotnet/dotnet-docker-samples),图片以

    开头
    FROM microsoft/aspnetcore-build:2.0 AS build-env
    

    这是一个多架构标签,这意味着它将根据主机(此处为 Ubuntu)拉取 Windows 或 Linux 容器
    但是您在previous question 中提到了pluralsight.com course docker-images-containers-aspdotnet-core 之后的内容,并且可能只有在Windows 上完成时才能工作(意味着Windows server 2016/2017,能够执行Windows 映像)

    【讨论】:

    • 感谢 VonC,很好地介绍了答案。我同意,多架构意味着它将针对 Linux(在我的情况下是 Ubuntu)或 Windows(我现在不关心)。复数视图也是多拱的,所以我很困惑,但我发现当你说它“可能只在 Windows 上完成时才有效”时,你似乎也不是 100% 确定 - 我还是一个新手,所以试图尽可能多地吸收
    • @pelican 是的,我的意思是我不确定特定教程是否能够在 Linux 上运行。
    • 所以看来我不能将我的 Ubuntu 用于我的 CI/CD 管道,因为我们的应用程序是基于 .NET 标准和 .NET Core 构建的,对吧?我知道 .NET Core 是跨平台的,但正如我们之前看到的,它似乎并没有在 linux 上运行像 dotnet publish 这样的简单命令。这很令人沮丧,因为 Ubuntu VM 是免费的,我可以将它们扔掉并重新创建新的,但是对于 Windows,我需要购买 Windows 10 Pro 或 Server 2016/2017 的许可证。我将尝试遵循他们的 Linux .NET 核心应用程序教程,但似乎我们不能在 Linux 上将 Docker 用于普通的 .NET 应用程序,而不是核心应用程序
    • 能否再简单介绍一下Docker for windows multi-arch?我的理解是它会查找正在运行的主机操作系统,并在此基础上提取适当的基础映像;所以如果我在 Ubuntu 上,查找应该强制使用 Jessie 或 Stretch 标记;相反,似乎发生的情况是,仅当您使用 Docker for windows 时才执行此查找,我假设这与 Linux 上的 Docker CE 不同?请问您对此有何看法,我只是想了解一下,然后我会就您在上面发送的链接回复您的回答
    • @pelican 在多架构部分:参见blog.docker.com/2017/11/multi-arch-all-the-thingscontainer-solutions.com/multi-arch-docker-images。如果有适用于 Linux/Ubuntu 的版本,它应该会找到它。但是您的教程可能会引用与 Linux 不兼容的图像。
    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2012-06-12
    • 2017-06-21
    相关资源
    最近更新 更多