如何使用.NET 6.0创建一个工作的Docker容器?

6rqinv9w  于 2023-05-16  发布在  Docker
关注(0)|答案(1)|浏览(176)

我已经设法使用Node和React创建了一个工作容器。我现在正在尝试创建一个docker容器来操作一个简单的C#可执行文件,它将侦听端口8000并发送回“hello world”。如果我通过访问http://localhost:8000/在本地运行它,它就可以工作了。

using System;
using System.Net;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        string url = "http://localhost:8000/";
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add(url);
        listener.Start();

        Console.WriteLine("Listening on {0}", url);

        while (true)
        {
            HttpListenerContext context = listener.GetContext();
            HttpListenerRequest request = context.Request;
            HttpListenerResponse response = context.Response;

            Console.WriteLine("{0} {1}", request.HttpMethod, request.Url);

            byte[] buffer = Encoding.UTF8.GetBytes("Hello, World!");
            response.ContentLength64 = buffer.Length;
            response.OutputStream.Write(buffer, 0, buffer.Length);
            response.OutputStream.Close();
        }
    }
}

我已经建立了程序,并将其移动到桌面的文件夹中:

正如你所看到的,我已经创建了Dockerfile,内容如下:

FROM mcr.microsoft.com/dotnet/runtime:6.0      

WORKDIR /HelloWorld

COPY . .

EXPOSE 8000

CMD ["/HelloWorld/DockerTest.exe"]

然后,我使用以下命令构建图像:

docker build -t imagename:tagname .

然后使用以下命令运行容器:

docker run --name containername -p 8000:8000 imagename:tagname

容器立即退出,退出代码为1,因此是一个错误,并且不生成日志。我认为我可能做错的是为.NET运行时使用错误的图像(mcr.microsoft.com/dotnet/runtime:6.0正确吗?)或忘记Dockerfile中的其他内容。如果你有任何问题我很乐意给予你更多的细节

iih3973s

iih3973s1#

mcr.microsoft.com/dotnet/runtime:6.0是一个基于Debian 11的Linux容器-在docker hub上查看信息:
6.0.16-bullseeye-slim-amd64,6.0-bullseeye-slim-amd64,6.0.16-bullseeye-slim,6.0-bullseeye-slim,6.0.16,6.0DockerfileDebian 1105/03/2023
所以它不能运行为Windows构建的.exe文件。
您需要切换到Windows容器或将命令更改为适用于Debian的命令,例如:

ENTRYPOINT ["dotnet", "DockerTest.dll"]

你也可以尝试使用VS工具来添加Docker支持。这将创建一个multistage build Docker文件,该文件将处理构建和生成结果映像。
附言

  • 另外,我建议创建一个ASP.NETCore项目(例如,为了简单起见,使用Minimal APIs),而不是直接创建HttpListener
  • "http://localhost:8000/"中的localhost将意味着它将只接受来自localhost的请求,在dockerized应用程序的情况下,localhost将是容器本身-有关详细信息和解决方案,请参阅this answer

相关问题