【问题标题】:How to compile and run a csharp file using dockerfile如何使用 dockerfile 编译和运行 csharp 文件
【发布时间】:2022-01-03 20:04:14
【问题描述】:

如何使用 docker 文件为简单的 csharp 应用程序编译一个(或多个)文件?我的目标是创建一个类似于 w3 学校 here 的小型 csharp repl。我看过this question,但它不适合我的需要。我没有 .csproj 文件,我从一个简单的 main.cs 文件开始,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;

class MainClass {
    static void Main() {
        Console.WriteLine("Hello World!");
    }
}

我想知道我可以将上面的代码作为一个字符串,并使用一个 dockerfile 来编译和运行它以获得输出。具体来说,我可以使用什么基础映像,在执行此操作之前是否需要安装任何其他软件包?下面的 dockerfile 取自另一个似乎合理但我不想编译 asp.net 程序的堆栈溢出问题。

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /app

COPY <your app>.csproj .
RUN dotnet restore <your app>.csproj

COPY . .
RUN dotnet publish -c Release -o out

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS runtime
WORKDIR /app
COPY --from=build /app/out ./

ENTRYPOINT ["dotnet", "<your app>.dll"]

【问题讨论】:

    标签: c# docker


    【解决方案1】:

    您可以使用命令dotnet new console 创建一个基本的控制台应用程序项目,然后将您的文件复制到生成的 Program.cs 文件之上以替换它。

    我冒昧地将您的 .NET core 2.2 映像替换为 .NET 6.0 映像,因为不再支持 2.2 映像。

    如果你用“MyFile.cs”中的代码命名你的文件并使用这个 Dockerfile,它应该可以工作

    FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
    WORKDIR /app
    RUN dotnet new console
    COPY MyFile.cs Program.cs
    RUN dotnet publish -c Release -o out
    
    FROM mcr.microsoft.com/dotnet/runtime:6.0
    WORKDIR /app
    COPY --from=build /app/out .
    ENTRYPOINT ["dotnet", "app.dll"]
    

    构建和运行

    docker build -t testimage .
    docker run --rm testimage
    

    随着对 .NET 6 的更改,您不再需要大量样板 C# 代码,因此您还可以将程序文件减少到一行

    Console.WriteLine("Hello World!");
    

    【讨论】:

    • 这非常有效!谢谢汉斯!
    • @cbutler 我在答案底部添加了一条关于减少 C# 文件的评论。
    【解决方案2】:

    也许你改变你的方法:创建一个完整的 Web 应用程序并使用 CSharpCodeProvider。您可以在此处阅读有关 CSharpCodeProvider 的更多信息:https://docs.microsoft.com/en-us/troubleshoot/dotnet/csharp/compile-code-using-compiler

    【讨论】:

    • 为什么是“Webapp”?
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • @MickyD 或带有 REST Api 的容器以文本形式发送代码。这并不重要。而不是每次用户想要编译代码时都部署一个容器
    • 您好,谢谢您的建议;我实际上确实构建了一个网络应用程序。它是一个在线代码编辑器,最初是一个用于响应的在线代码编辑器。它已经发展到支持更多,现在我正在试验对编译语言的支持。看看,让我知道你的想法:contrived-dev.herokuapp.com
    • @cbutler 很酷的项目。但在你的机器上编译和执行其他人创建的代码时要小心;)
    【解决方案3】:

    .csproj 站在那里是有原因的。要在没有它的情况下编译 .cs 文件,您必须找到相应的命令行参数来构造最小的集合 编译时的配置(如编译 C/C++ 项目时的 -I、-D、-L 等),这将导致您的项目不熟悉标准 IDE(VS、VSCode),并需要更多时间来传输操作指南为你的队友打造。

    在大多数类似生产的应用程序中,事情变得复杂,您很快就会需要一个项目配置文件。这就是为什么 C/C++ 项目中有 Makefile,Java-Maven 项目中有 pom.xml 等原因。

    IMO,“过度”简化不会让您的项目更简单。专注于如何使用默认配置解决业务问题并在需要时将其最小化/简化将是更好的选择。

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多