【问题标题】:Arch Linux - dotnet core 2 with dockerArch Linux - 带有 docker 的 dotnet core 2
【发布时间】:2018-02-04 17:17:12
【问题描述】:

更新 好的,我想出了一些办法,但我仍然没有解决方案。这个问题似乎只发生在基于 Arch 的系统(Antergos、Manjaro、Arch)上。

如果我使用 xfce 和 docker 以及 dotnet core 2 安装干净的系统,我可以使用 dotnet core 构建和运行 docker 映像。

安装VirtualBox后,开始出现下面的问题,所以我怀疑它与一些不起眼的内核模块有关???

同样卸载virtualbox并不能解决问题,唯一的解决办法是重新安装Arch Fresh,这很痛苦。也不能在同一系统上运行 docker 和 virtualbox,同时尝试使用 docker 开发 dotnet core。

结束更新

我正在尝试使用 docker 运行 dotnet core 2,基于 microsoft 文档 (https://github.com/dotnet/dotnet-docker-samples/tree/master/aspnetapp):

我的 Dockerfile 看起来像这样:

FROM microsoft/aspnetcore-build:2.0.0 AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# build runtime image
FROM microsoft/aspnetcore:2.0.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "api.bauernsuche.de.dll"]

然后我通过以下方式开始映像构建过程:

docker build -t bauernsucheapi .

构建完成后,我尝试通过以下方式启动新映像:

docker run -it --rm -p 5000:80 --name bauernsuche_api bauernsucheapi

预期:容器正在运行

IS:错误消息: 您的意思是运行 dotnet SDK 命令吗?请从以下位置安装 dotnet SDK: http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

现在,由于我使用的是 Microsoft Docker iage,因此我希望 SDK 可以在此使用。此外,我的 Dockerfile 是 Microsoft 示例的直接副本,但有一个更改:版本号从 2.0 更改为 2.0.0,这似乎是正确的,因为 2.0 给了我找不到图像的错误。

那我做错了什么?

我的 .csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
    <PackageReference Include="Moq" Version="4.7.99" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="2.0.0" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="1.0.0" />
    <PackageReference Include="xunit" Version="2.3.0-beta4-build3742" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
    <DotNetCliToolReference Include="dotnet-xunit" Version="2.3.0-beta4-build3742" />
    <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
  </ItemGroup>
</Project>

【问题讨论】:

  • 你能不能把ENTRYPOINT ["dotnet", "api.bauernsuche.de.dll"]改成ENTRYPOINT ["ls", "-al"],看看你在当前文件夹里看到了什么文件
  • 我无法在评论中发布输出,但我期望的一切都在那里(输出目录的内容包括 api.bauernsuche.de.dll)
  • 另外从错误消息中我怀疑 dotnet 命令在路径中以某种方式丢失或不在...
  • 我替换了 ENTRYPOINT ["/bin/bash"] 并且当我在 docker 容器中时,我可以运行 dotnet api.bauernsuche.de.dll 并且它工作正常......但是当我进入 dotnet运行 api.bauernsuche.de.dll 我得到同样的错误信息。不知何故,入口点将我的 dotnet api.bauernsuche.de.dll 变成了 dotnet run api.bauernsuche.de.dll
  • 当我使用 /bin/sh 并输入 dotnet api.bauernsuche.de.dll 时出现错误,所以我想解决方案是使用 ENTRYPOINT ["/bin/bash", "dotnet ", "api.bauernsuche.de.dll"]

标签: docker .net-core dockerfile


【解决方案1】:

编辑: 正如我回答here

您可以看到此错误消息的一个原因是当参数 传递给dotnet 是未知的。

runtime 无法识别您传递给它的参数,并且 想知道您是否应该改用sdk

确保 dll 的名称及其路径在以下位置正确:

ENTRYPOINT ["dotnet", "api.bauernsuche.de.dll"]

另外,请确保 COPY 指令按预期工作,以便 dll 位于 WORKDIR 位置。

原答案:

您使用的图像没有 SDK。

这是一个示例,展示了在图像中构建应用程序,然后使用结果创建一个新应用程序:

FROM microsoft/dotnet:2.0-sdk AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out -r debian.8-x64

# build runtime image
FROM microsoft/dotnet:2.0-runtime

WORKDIR /app
COPY --from=build-env /app/out ./
EXPOSE 5000/tcp
ENTRYPOINT ["dotnet", "api.dll"]
# To be able to pass parameters (e.g.: override configuration)
CMD []

取自here

注意第一个是 sdk 图像,第二个是 runtime。就像你可以在downloading from the website时选择一样。

【讨论】:

【解决方案2】:

所以我不确定问题出在哪里,但在 shbash 之间切换会有所帮助。我将这主要归因于基础映像中的错误,您应该报告它。但下面应该为你解决它

FROM microsoft/aspnetcore-build:2.0.0 AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# build runtime image
FROM microsoft/aspnetcore:2.0.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["/bin/bash", "-lc", "dotnet api.bauernsuche.de.dll"]

【讨论】:

  • No change ENTRYPOINT ["/bin/bash", "-lc", "dotnet api.bauernsuche.de.dll"] 也不起作用。我将在图像的 githubpage 上提交一个错误,似乎我在这里没有做任何可怕的错误,这闻起来像一个错误:(
  • 是的,这有点奇怪。我现在唯一能说的就是用 CMD 代替 ENTRYPOINT 尝试一次
【解决方案3】:

我正在做类似的事情,运行一个用 F# 编写并与 Docker 打包的 Dotnet Core 2.x Web 服务。我也像你一样使用带有运行 ID 的发布来构建应用程序,但我启动它的方式不同。

您可以直接指定在发布输出文件夹中生成的可执行二进制文件,而不是使用dotnet 作为运行程序。在我的情况下,可执行文件称为“Main”,我只是直接运行它。它基本上是主机平台的原生引导程序,它启动 Dotnet 应用程序,该应用程序包含在所有随附的 dll 中。您不需要 SDK 即可工作,您可以从我的 Docker 文件中看到:

FROM microsoft/dotnet:2-runtime
WORKDIR /opt/dotnetservice
ADD Main/publish .
ENV PATH="/opt/dotnetservice:${PATH}"
EXPOSE 8080
CMD ["Main"]

linked question中有一个完整的小例子

【讨论】:

    【解决方案4】:

    我的解决方案是提供 dotnet 可执行文件的完整路径(“/usr/share/dotnet/dotnet”)查看最后阶段的入口点

    FROM microsoft/aspnetcore-build:2.0 AS build-env
    WORKDIR /code
    COPY . .
    WORKDIR /code/src/BasicWebTemplate.Web
    RUN mkdir /publish
    RUN dotnet publish -c Release -o /publish
    
    FROM microsoft/aspnetcore:2.0
    EXPOSE 80
    COPY --from=build-env /publish /app
    WORKDIR /app
    ENTRYPOINT ["/usr/share/dotnet/dotnet", "BasicWebTemplate.Web.dll"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多