为.NET Framework项目创建一个基于Linux的Docker文件

13

我有一个ASP.Net Framework 4.8项目。我想为这个项目创建一个基于Linux的Docker文件,但我找不到一个可用作.NET Framework基础镜像的基于Linux的镜像。如何为此创建一个Docker文件?


5
你需要寻找一个Mono容器。https://hub.docker.com/_/mono。在Linux上没有官方的Microsoft .NET Framework实现;Mono是你能得到的最好的选择。 - Daniel Mann
1
你能解释得更详细一些吗?或者给我一个例子?或者发送一个链接? - Hamed Hajiloo
1
我已经提供了一个指向 Docker Hub mono 镜像的链接。那是你想要用于应用程序的基础镜像。这并不能保证它一定能正常工作,但那应该是你的起点。 - Daniel Mann
2个回答

11

经过一周的尝试,我终于得到了答案。

我们需要基于Nginx镜像并在其上安装mono。

  1. 创建一个包含以下内容的文件夹:

enter image description here

  1. dist文件夹中发布你的asp项目。
  2. 在Nginx文件夹中创建一个名为sites-available的文件夹。
  3. 在sites-available文件夹中创建一个名为default的文件,并加入以下代码:
    server {
             listen   80;
             access_log   /var/log/nginx/mono-fastcgi.log;
             root /var/www/;
             server_tokens off;
             more_clear_headers Server X-AspNet-Version;
    
             location / {
                     index index.html index.htm default.aspx Default.aspx;
                     fastcgi_index /;
                     fastcgi_pass unix:/var/run/mono-fastcgi.sock;
                     include /etc/nginx/fastcgi_params;
             }
     }
在Nginx文件夹中创建一个名为fastcgi_params的文件,并添加以下代码:
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

fastcgi_param  PATH_INFO          "";
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

在pools文件夹中创建一个名为sample.webapp的文件,并添加以下代码:
<?xml version="1.0" encoding="UTF-8"?>
<apps>
    <web-application>
        <name>root</name>
        <vhost>*</vhost>
        <vport>-1</vport>
        <vpath>/</vpath>
        <path>/var/www/sample-app/</path>
    </web-application>
</apps>
  1. supervisord.conf 文件:
[supervisord]
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes = 50MB
nodaemon=true
user=root

[program:mono]
command=fastcgi-mono-server4 --appconfigdir=/etc/mono/pools --socket=unix --filename=/var/run/mono-fastcgi.sock --printlog --name=mono
user=root
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:nginx]
command=nginx
user=root
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

  • 最后是Dockerfile:
  • FROM mono:latest
    
    RUN apt-get update \
      && apt-get install -y \
      iproute2 supervisor ca-certificates-mono fsharp mono-vbnc nuget \
      referenceassemblies-pcl mono-fastcgi-server4 nginx nginx-extras \
      && rm -rf /var/lib/apt/lists/* /tmp/* \
      && echo "daemon off;" | cat - /etc/nginx/nginx.conf > temp && mv temp /etc/nginx/nginx.conf \
      && sed -i -e 's/www-data/root/g' /etc/nginx/nginx.conf
    
    COPY nginx/ /etc/nginx/
    COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
    COPY pools /etc/mono/pools
    COPY dist /var/www/sample-app
    
    
    EXPOSE 80
    
    ENTRYPOINT [ "/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf" ]
    
    

    你好,能提供一个示例存储库吗?我正在尝试将asp.net web forms项目docker化,以便外部的Mac OS开发人员可以使用vs code远程ssh来处理这些项目...将其移植到.NET是在路线图上的。但在此之前,仍需要进行开发工作。 - Muhammad Ahmod

    5

    .NET Framework不支持跨平台,ASP.NET本身也不支持。它们不能在Linux上运行。因此,没有基于Linux的容器映像可以让你运行.NET Framework或ASP.NET Framework。

    而且你也无法制作自己的映像;.NET Framework简单地无法在Linux上运行。

    这就是为什么微软创建了.NET Core(现在被称为.NET)和ASP.NET Core,以便它们可以跨平台,并且你可以在Linux上使用这些,包括基于Linux的容器映像。


    正如一些评论中建议的那样,你可能能够使用Mono。Mono是一个(不受真正支持的)实现.NET Framework的项目,旨在在Linux上工作。它不是100%与.NET Framework兼容,所以你的应用程序可能会或可能不会在其中工作。


    更好但更困难的选择是将你的应用程序移植到支持在基于Linux容器的ASP.NET Core 6上。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接