英文:
How to create a working Docker Container With .NET 6.0?
问题
I've translated the code and relevant information for you:
我已成功创建了一个使用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中忘记了其他内容。如果您有任何问题,我将很乐意提供更多详细信息。
Please note that I've translated the code and information as requested. If you have any specific questions or need further assistance, feel free to ask.
英文:
I've already managed to create a working container using Node and React.
I'm now trying to create a docker container to operate a simple C# executable which will listen on port 8000 and send back "hello world". It works if I run it locally by visiting http://localhost:8000/
Here is the code:
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();
}
}
}
I have the built the program and moved it in a folder in the desktop:
As you can see I've created the Dockerfile, with this content:
FROM mcr.microsoft.com/dotnet/runtime:6.0
WORKDIR /HelloWorld
COPY . .
EXPOSE 8000
CMD ["/HelloWorld/DockerTest.exe"]
I've then built the image using:
docker build -t imagename:tagname .
And then run the container by using:
docker run --name containername -p 8000:8000 imagename:tagname
The container exits immediately with exit code 1, so a error, and it produces no logs.
What i think I could be doing wrong is using the wrong image for the .NET runtime
(is mcr.microsoft.com/dotnet/runtime:6.0 correct?) or forgetting something else in the Dockerfile. If you have any questions I'll be happy to give you more details
答案1
得分: 2
mcr.microsoft.com/dotnet/runtime:6.0
是基于 Debian 11 的 Linux 容器 - 在 docker hub 查看详细信息:
> 6.0.16-bullseye-slim-amd64, 6.0-bullseye-slim-amd64, 6.0.16-bullseye-slim, 6.0-bullseye-slim, 6.0.16, 6.0 Dockerfile Debian 11 05/03/2023
因此,它无法运行专为 Windows 构建的 .exe
文件。
您需要切换到 Windows 容器或更改命令以适用于 Debian,类似于:
ENTRYPOINT ["dotnet", "DockerTest.dll"]
此外,您可以尝试使用 VS 工具来添加 Docker 支持。这将创建一个多阶段构建的 Docker 文件,用于处理构建和生成结果镜像。
附言:
-
我建议创建一个 ASP.NET Core 项目(例如,使用 Minimal APIs 来简化),而不是直接使用
HttpListener
。 -
在
"http://localhost:8000/"
中的localhost
意味着它将仅接受来自本地主机的请求,对于容器化应用程序来说,本地主机将是容器本身 - 请参阅此答案了解详细信息和解决方案。
英文:
mcr.microsoft.com/dotnet/runtime:6.0
is a Linux container based on Debian 11 - check out info at docker hub:
> 6.0.16-bullseye-slim-amd64, 6.0-bullseye-slim-amd64, 6.0.16-bullseye-slim, 6.0-bullseye-slim, 6.0.16, 6.0 Dockerfile Debian 11 05/03/2023
So it can't run .exe
files which are build for Windows.
You need to either switch to Windows container or change command to a valid one for Debian, something like:
ENTRYPOINT ["dotnet", "DockerTest.dll"]
Also you can try using VS tools to add Docker support. This should create a multistage build Docker file which will handle both building and producing the resulting image.
P.S.
-
Also I would recommend creating an ASP.NET Core project (using Minimal APIs for simplicity for example) instead of
HttpListener
directly. -
localhost
in"http://localhost:8000/"
will mean that it will accept only requests from localhost which in case of dockerized application will be the container itself - see this answer for details and solutions.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论