【问题标题】:DotNet build CLI works in terminal, but not in Docker buildDotNet 构建 CLI 在终端中有效,但在 Docker 构建中无效
【发布时间】:2016-10-10 21:18:46
【问题描述】:

这是我第一次尝试同时使用 .net core 和 docker。我不知道出了什么问题。

我可以在终端中运行dotnet restore / dotnet build / dotnet run 没有任何问题。该网站加载得很好。所以我想尝试一下 docker(最终在云中的 VM 上运行)。

我运行 docker build -t latest . 导致:

Step 5 : RUN dotnet build
     ---> Running in e463aff85460
    Project app (.NETCoreApp,Version=v1.0) will be compiled because project is not safe for incremental compilation. Use --build-profile flag for more information.
    Compiling app for .NETCoreApp,Version=v1.0
    /app/project.json(32,58): error NU1001: The dependency Microsoft.EntityFrameworkCore.Sqlite >= 1.0.1 could not be resolved.

    Compilation failed.
        0 Warning(s)
        1 Error(s)

    Time elapsed 00:00:00.0174732

    The command 'dotnet build' returned a non-zero code: 1

我尝试更改 project.json 中的 SQLite 版本,但没有任何运气。

NuGet 存储库: 使用的饲料:

https://www.myget.org/F/aspnetcirelease/api/v3/index.json

https://api.nuget.org/v3/index.json

dotnet --version
1.0.0-preview3-003786

没有对 dockerfile 进行编辑:

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

CMD ["dotnet", "run", "--server.urls", "http://*:5000"]

在谷歌搜索后尝试创建一个 .dockerignore,但没有任何运气:

.git
Dockerfile
.DS_Store
.gitignore
README.md
project.lock.json

我在最新的 macOS (10.12) 上。

package.json:

{
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.0.1",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Configuration.CommandLine": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
    "Microsoft.EntityFrameworkCore": "1.0.1",
    "Microsoft.EntityFrameworkCore.Design": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.EntityFrameworkCore.Relational": "1.0.1",
    "Microsoft.EntityFrameworkCore.SQLite": "1.0.1",
    "Microsoft.EntityFrameworkCore.Sqlite.Design": "1.0.1"
  },

  "tools": {
    "BundlerMinifier.Core": "2.0.238",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "precompile": [ "dotnet bundle" ],
    "prepublish": [ "bower install" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  },

  "tooling": {
    "defaultNamespace": "MyFirstApp"
  }
}

尝试构建 docker 容器后的输出:

Sending build context to Docker daemon 26.39 MB
Step 1 : FROM microsoft/dotnet:latest
 ---> 96d122fe36cb
Step 2 : WORKDIR /root
 ---> Using cache
 ---> 0c5317108a5b
Step 3 : COPY bin/Debug/netcoreapp1.0/publish/ /root/
 ---> Using cache
 ---> d79700fa6c36
Step 4 : ENTRYPOINT dotnet /root/MyProject.dll
 ---> Using cache
 ---> a99f30826ddd
Successfully built a99f30826ddd

【问题讨论】:

    标签: .net macos docker asp.net-core dockerfile


    【解决方案1】:

    图像 microsoft/dotnet:latest 不是为构建而设计的,而是为运行时而设计的。

    将 .net 核心应用程序发布到 docker 的最佳方式是:

    1. dotnet restore
    2. dotnet publish
    3. docker build -t your-tag 与 Dockerfile 类似:

      FROM microsoft/dotnet:latest
      WORKDIR /root
      COPY bin/Debug/netcoreapp1.0/publish/ /root/
      ENTRYPOINT dotnet /root/[your-project-name].dll
      

      其中 bin/Debug/netcoreapp1.0/publish 是您真正的发布路径。

    如果您想在 docker 中构建 .net 核心应用程序,请使用此图像:

    FROM microsoft/dotnet:onbuild
    

    图片版本的区别解释here

    问候

    【讨论】:

    • 更好的链接描述图像之间的差异docs.microsoft.com/en-us/dotnet/articles/core/docker/…
    • @DannyThunder 是的 - 我使用 docker 而不是 dotnet,谢谢。现在是深夜..已编辑
    • 找不到与命令“dotnet-/root/app/MyProject.dll”匹配的可执行文件,尝试了一切,但我遇到了这个错误。
    • @DannyThunder 运行发布命令后,绿色输出上写的是什么?它是位于路径或您提供的路径上的真正 .dll? -- 恕我直言,发布后的 .dll 应直接复制到 /root 文件夹(不带 app/)。您的 ENTRYPOINT 是什么样的?
    • 在原始帖子中添加了输出。试图找出如何在我的容器中显示文件,但没有成功找到一种简单的方法(如 ls -l)
    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 2020-12-24
    • 1970-01-01
    • 2023-04-05
    • 2017-03-29
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多