docker中asp.net core的appsetting与user limit (128)

-- docker中asp.net core报错:the configured user limit (128) on the number of inotify instances has been reached
【官网】:https://github.com/dotnet

应用场景

当我们把asp.net core web程序部署到docker中时,有时会报错:'the configured user limit (128) on the number of inotify instances has been reached'.

基础资源

使用须知

1)根据具体的.net core 版本使用对应的代码。 2)如果不是docker环境,且需要关注文件自动加载更新则慎用本篇介绍的方法。

配置步骤


【方案1:  增加相关限制的环境配置

增加fs.inotify.max_user_instances/etc/sysctl.conf:

echo fs.inotify.max_user_instances=524288  或


sudo tee -a /etc/sysctl.conf && sudo sysctl -p

【方案2.1:  低于asp.net core 3.1版本中关闭监控文件修改开关:reloadOnChange】

<步骤1>
public interface IConfigurationManager
{
    T GetAppConfig<T>(string key, T defaultValue = default(T));
}
 
public class ConfigurationManager : IConfigurationManager
{
    private readonly IConfigurationRoot config;
 
    public ConfigurationManager(IConfigurationRoot config)
        => this.config ?? throw new ArgumentNullException(nameof(config));
 
    public T GetAppConfig<T>(string key, T defaultValue = default(T))
    {
        T setting = (T)Convert.ChangeType(configuration[key], typeof(T));
        value = setting;
        if (setting == null)
            value = defaultValue;
    }
}
<步骤2>


services.AddSingleton<IConfigurationManager>(new ConfigurationManager(this.Configuration));


【方案2.2:  asp.net core 3.1中关闭监控文件修改开关:reloadOnChange】


public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.AddJsonFile("appsettings.json",
                optional: true,
                reloadOnChange: false);
 config.AddJsonFile($"appsettings.{environmentName}.json", true, false); })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
}


常见问题

快速入门

【如何让docker中已部署的asp.net core 程序对应的appsetting.json的变更生效?】

   步骤: 需要删除->重新创建容器->部署容器.

  : 即使重启docker也无法实现,根据普通的Unix模型.进程可以为其子进程设置初始环境,但是一旦它执行了子进程,它就不再能够控制环境了. docker exec在容器命名空间中启动一个新进程,因此如果更改环境变量,它只会影响该进程而不影响主容器进程.

有许多选项只能在初始docker run命令期间设置.这包括环境变量,还包括卷装入和已发布端口.重要的是,它还包括底层image:如果您有新的应用程序版本,或者需要更新底层操作系统分发以解决安全问题, 只有删除并重新创建容器.  根据经验"docker rm"是常见处理命令。

       换一句话说:一旦构建了容器并将其以不可变的版本推送到其容器存储库后,它就不会更改(只有部署时的环境变量才能修改)。在这种情况下,完全没必要打开“ reloadOnChange”。关闭它,导致出现"the configured user limit (128) on the number of inotify instances has been reached"问题的次数少很多。


参考资料