我已经设法使用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中的其他内容。如果你有任何问题我很乐意给予你更多的细节
1条答案
按热度按时间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的命令,例如:
你也可以尝试使用VS工具来添加Docker支持。这将创建一个multistage build Docker文件,该文件将处理构建和生成结果映像。
附言
HttpListener
。"http://localhost:8000/"
中的localhost
将意味着它将只接受来自localhost的请求,在dockerized应用程序的情况下,localhost将是容器本身-有关详细信息和解决方案,请参阅this answer。