Arch Linux - 带有docker的dotnet core 2

时间:2017-09-10 09:13:08

标签: docker .net-core dockerfile

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

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

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

同样卸载virtualbox无法解决问题,只有解决方案是重新安装Arch新鲜,这很痛苦。此外,在尝试使用docker开发dotnet核心时,无法在同一系统上运行docker和virtualbox。

结束更新

我试图让dotnet core 2与docker一起运行,基于microsofts dokumentation(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示例中的一个直接副本,只有一个更改:Versionnumber从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>

4 个答案:

答案 0 :(得分: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 图像,第二个是运行时。正如您可以选择downloading from the website

答案 1 :(得分:0)

所以我不确定问题是什么,但在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"]

答案 2 :(得分:0)

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

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

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

linked question

中有一个完整的迷你示例

答案 3 :(得分:0)

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

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"]