Code Monkey home page Code Monkey logo

apollo.net's Introduction

Apollo配置中心的.Net客户端,更多关于Apollo配置中心的介绍,可以查看Apollo配置中心Wiki

一、框架集成

  1. Microsoft.Extensions.Configuration集成请参考Com.Ctrip.Framework.Apollo.Configuration文档,完全支持IConfiguration的变动通知
  2. System.Configuration.ConfigurationManager集成(.net 4.7.1及以后版本)或直接使用ApolloConfigurationManager请参考Com.Ctrip.Framework.Apollo.ConfigurationManager文档
  3. 如果想将传统的config配置(如web.config)转成json配置,可以使用config2json工具

二、日志输出

默认Sdk内部的日志不会输出,需要输出日志的请设置Com.Ctrip.Framework.Apollo.Logging.LogManager.LogFactory属性。

内部内实现了控制台日志

LogManager.UseConsoleLogging(logLevel);

三、客户端设计

client-architecture

上图简要描述了Apollo客户端的实现原理:

  1. 客户端和服务端保持了一个长连接,从而能第一时间获得配置更新的推送。(通过Http Long Polling实现)
  2. 客户端还会定时从Apollo配置中心服务端拉取应用的最新配置。
    • 这是一个fallback机制,为了防止推送机制失效导致配置不更新
    • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified
    • 定时频率默认为每5分钟拉取一次,客户端也可以通过App.config设置Apollo.RefreshInterval或者appsettings.json设置Apollo:RefreshInterval来覆盖,单位为毫秒。
  3. 客户端从Apollo配置中心服务端获取到应用的最新配置后,会保存在内存中
  4. 客户端会把从服务端获取到的配置在本地文件系统缓存一份
    • 在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置
  5. 应用程序可以从Apollo客户端获取最新的配置、订阅配置更新通知

四、本地开发模式

当开发环境无法连接Apollo服务器的时候,会降级为读取本地配置文件,请先在普通模式下使用Apollo,这样Apollo会自动创建该目录并在目录下生成配置文件。

Apollo不会实时监测文件内容是否有变化,所以如果修改了配置,需要重启应用生效。

4.1 本地配置目录

本地配置目录位于:

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data\{appId}\config-cache

appId就是应用的appId,如100004458。

请确保该目录存在,且应用程序对该目录有读权限。

【小技巧】 推荐的方式是先在普通模式下使用Apollo,这样Apollo会自动创建该目录并在目录下生成配置文件。

4.2 本地配置文件

本地配置文件需要按照一定的文件名格式放置于本地配置目录下,文件名格式如下:

{appId}+{cluster}+{namespace}.json

  • appId就是应用自己的appId,如100004458
  • cluster就是应用使用的集群,一般在本地模式下没有做过配置的话,就是default
  • namespace就是应用使用配置namespace,一般是application client-local-cache

文件内容以json格式存储,比如如果有两个key,一个是request.timeout,另一个是batch,那么文件内容就是如下格式:

{
    "request.timeout":"1000",
    "batch":"2000"
}

apollo.net's People

Contributors

anilople avatar czd890 avatar harris2012 avatar labelzhou avatar linkinshi avatar michael2xiang avatar moonheart avatar nobodyiam avatar pengweiqhca avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

apollo.net's Issues

操作超时如何解决?

提示:Could not complete get operation [Cause: The operation has timed out ]
设置Apollo.Timeout,Apollo.ReadTimeout也无法解决。

.Net Web API 4.71 下 IConfiguration[key] 不能获取最新配置内容

image
如图,将 key aaa 从 aoaoao... 更新 为 aoao 后,
Configuration[key].value:aoaoao....,AppSetting[key].value:aoao
Global 配置如下
public class WebApiApplication : System.Web.HttpApplication
{
public static IConfiguration Configuration { get; private set; }
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);

        Configuration = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
          .AddApollo(ConfigurationManager.AppSettings["Apollo.AppId"], ConfigurationManager.AppSettings["Apollo.MetaServer"])
          .AddDefault()
          .Build();
    }
}

Web.config 配置如下

<configSections> <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </configSections> <configBuilders> <builders> <add name="AppSettingsSectionBuilder" type="Com.Ctrip.Framework.Apollo.AppSettingsSectionBuilder, Com.Ctrip.Framework.Apollo.ConfigurationManager" /> <add name="ConnectionStringsSectionBuilder" type="Com.Ctrip.Framework.Apollo.ConnectionStringsSectionBuilder, Com.Ctrip.Framework.Apollo.ConfigurationManager" /> </builders> </configBuilders> <connectionStrings configBuilders="ConnectionStringsSectionBuilder" /> <appSettings configBuilders="AppSettingsSectionBuilder"> <add key="Apollo.AppId" value="sunnytest" /> <add key="Apollo.Timeout" value="5000" /> <add key="Apollo.RefreshInterval" value="3000" /> <add key="Apollo.Env" value="Dev" /> <add key="Apollo.MetaServer" value="http://192.168.5.133:8080/" /> <add key="Apollo.ConfigServer" value="http://192.168.5.133:8080/" /> </appSettings>
获取代码如下
[HttpGet]
[Route("api/Apollo/Section/{key}")]
public async Task Section(string key)
{
var config = WebApiApplication.Configuration;

        //await ApolloConfigurationManager.GetAppConfig();

        if (string.IsNullOrEmpty(key))
            return await Task.FromResult<string>(null);
        var value = config[key];
        var value2 = ConfigurationManager.AppSettings[key];

        return await Task.FromResult($"{nameof(key)}:{key},Configuration[key].value:{value},AppSetting[key].value:{value2}");
    }

配置存储

我看了net core一些源码,里面实现了ApolloConfigurationBuilder可实现appsetting的一些配置的转移,项目的相关配置信息会保存两份,一份在Apollo里,一份在实现的IConfigurationSource的Data里,这样是否会有资源浪费?

使用强类型配置注入的问题

看多数demo都是直接注入IConfiguration使用的.我想使用强类型的Options,不知道这方面支持怎么样.

单例的IOptions<TOptions>是肯定可以的,IOptionsMonitor<TOptions>呢?

有没有计划支持asp.net core

我司想采用归司的配置中心,但是当前所有的业务系统均采用asp.net core,正打算阅读源码改成支持asp.net core。

有个空指针小问题

Application startup exception
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value)
at System.Collections.Generic.HashSet`1.Add(T item)
at Com.Ctrip.Framework.Apollo.Internals.RemoteConfigLongPollService.Submit(String namespaceName, RemoteConfigRepository remoteConfigRepository)
Aborted (core dumped)
at Com.Ctrip.Framework.Apollo.Inte

如上是错误信息,使用的是.net core客户端,下面是错误行


ApolloConfigurationManager apolloConfigurationManager = new ApolloConfigurationManager();

apolloConfigurationManager.GetConfig("application").ConfigureAwait(true).GetAwaiter().GetResult().ConfigChanged += OnDatabaseChanged;

使用此方式当配置刷新时,自动应用配置内容,如数据库连接等。错误发生在项目启动时,但并不必现,使用的版本是1.5.0。
65128026-3f2eee80-da2b-11e9-9b98-cc3d683d24c7

apollo 轮训notifications接口的问题

你好,从监控数据来看,apollo 客户端每隔一分钟就会向eureka服务器端请求最新的配置,如果没有是返回304.我的疑问是,配置了refreshinterval,但是并没有起到作用。并且和原本代码里注明的5min不太一样。能否给解答一下呢?谢谢

使用内存过高

手里有一个.net core api的项目,情况是这样的:
在没有使用阿波罗配置的时候 这个项目占用的内存基本是在50M左右的,一旦启用了阿波罗配置,并且访问之后每次访问差不多都能增加1M左右的内存使用而没有使用阿波罗则没有这种情况

建议加上apollo 1.6+的秘钥通讯功能

建议在Apollo\Util\Http\HttpUtil.cs文件的Task<HttpResponse> DoGetAsync(string url, int timeout)方法中加上签名的功能,或者扩展出增加Request Header的选项吧

.net core无法读取到配置

Configuration.GetValue("ApNames")返回数据是null,我确认已经在web上设置值了的
自动生成了C:\opt\data\baidu\config-cache文件夹,但是文件夹里面是空的。
客户端有debug功能吗?可以打印日志信息吗?现在有问题都无从查起。

AsyncHelper 还是会引起死锁

在同步方法中调用异步方法,不管怎么尝试,在高负载的情况下还是会引起死锁,下面是我的测试代码

namespace AsyncTestConsoleApp
{
    class Program
    {
        private static readonly TaskFactory MyTaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);

        private static void RunSync(Func<Task> func)
        {
            var cultureUi = CultureInfo.CurrentUICulture;
            var culture = CultureInfo.CurrentCulture;
            MyTaskFactory.StartNew(() =>
            {
                Thread.CurrentThread.CurrentCulture = culture;
                Thread.CurrentThread.CurrentUICulture = cultureUi;
                return func();
            }).Unwrap().GetAwaiter().GetResult();
        }
        public static void PrintThreadLog(string title)
        {
            if (string.IsNullOrWhiteSpace(title))
            {
                title = "默认";
            }
            ThreadPool.GetMinThreads(out var minWorker0, out var minIOC0);
            ThreadPool.GetMaxThreads(out var maxWorker0, out var maxIOC0);
            ThreadPool.GetAvailableThreads(out var aWorkerThreads, out var aCompletionPortThreads);
            Console.WriteLine($"{title}:minWorker:{minWorker0} minIOC:{minIOC0}");
            Console.WriteLine($"{title}:maxWorker:{maxWorker0} maxIOC:{maxIOC0}");
            Console.WriteLine($"{title}:AvailableWorker:{maxWorker0} AvailablemaxCompletionPortThreads:{maxIOC0}");
        }
        static void Main(string[] args)
        {
            ThreadPool.SetMinThreads(2, 200);
            ThreadPool.SetMaxThreads(5, 200);
            PrintThreadLog("");
            IConnection connection = new Connection(new User());

            int waitingStart = 0, inProgress = 0;

            int sleepTime = 150;

            int waited = 0;

            for (; ; )
            {
                Interlocked.Increment(ref waitingStart);
                // 模拟客户端请求
                // assume IConnection interface can't be changed to async
                ThreadPool.QueueUserWorkItem(
                    _ =>
                    {
                        Interlocked.Decrement(ref waitingStart);
                        Interlocked.Increment(ref inProgress);
                        //await connection.OnRequestReceivedAsync("request");
                        connection.OnRequestReceived("request");
                        Interlocked.Decrement(ref inProgress);
                    });

                string msg = string.Format(
                    "Requests in queue: {0}, requests in progress: {1}, current sleep time: {2}",
                    Volatile.Read(ref waitingStart),
                    Volatile.Read(ref inProgress),
                    Volatile.Read(ref sleepTime));

                bool poolAlive = CheckPoolAlive();
                if (waited > 500 || !poolAlive)
                {
                    Console.Clear();
                    Console.WriteLine(msg);
                    waited = 0;
                }
                if (!poolAlive)
                    throw new InvalidOperationException("ThreadPool deadlocked! " + msg);

                if (sleepTime > 30) sleepTime--;
                Thread.Sleep(sleepTime);
                waited += sleepTime;
            }
        }

        static bool CheckPoolAlive()
        {
            // very simple check for ThreadPool deadlock
            // during this check no new requests will be enqueued
            // failing this check means that all current executing requests will never finish
            using (ManualResetEventSlim ok = new ManualResetEventSlim(false))
            {
                ThreadPool.QueueUserWorkItem(_ => ok.Set());
                return ok.Wait(30000);
            }
        }

        interface IConnection
        {
            void OnRequestReceived(string request);

            Task OnRequestReceivedAsync(string request);
        }

        class Connection : IConnection
        {
            readonly User _user;

            public Connection(User user)
            {
                _user = user;
            }

            public void OnRequestReceived(string request)
            {
                // 同步调用异步
                //var task = _user.HandleRequest(request);
                RunSync(()=> _user.HandleRequest(request));
                //task.Wait();
                //tas
                //task.GetAwaiter().GetResult();
                //if (!task.Result) throw new InvalidOperationException();
            }

            public async Task OnRequestReceivedAsync(string request)
            {
                // 同步调用异步
                var task = await _user.HandleRequest(request);
                if (!task) throw new InvalidOperationException();
            }
        }

        class User
        {
            public async Task<bool> HandleRequest(string request)
            {
                //下面这句会把当前控制权交给调用者
                await Task.Delay(Rnd.Next(30, 700)); // 模拟各种操作
                return true;
            }
        }

        [ThreadStatic]
        static Random _rnd;

        static Random Rnd => _rnd ?? (_rnd = new Random(Guid.NewGuid().GetHashCode()));
    }
}

所以,作为一个标杆项目,在代码中出现同步方法调用异步的是不是不太合适,谢谢!

Apollo 配置 直接序列化对象

net461下Apollo配置能不能直接序列化对象,这里的配置可以是全部,也可以是其中的一部分。类似于JsonConvert.SerializeObject();

采用web.config中配置的方式(AppSettingsSectionBuilder)配置中心修改后无法将最新配置刷入ConfigurationManager.AppSettings

core分支,参见Apollo.AspNet.Demo中,采用在web.config中配置的方式,当配置中心发布配置后,客户端收到了最新配置,opt中的配置文件也是最新的,但是通过ConfigurationManager.AppSettings获取的配置还是旧的。看到源码中ApolloConfigurationBuilder类private void Config_ConfigChanged(object sender, ConfigChangeEventArgs args) => ConfigurationManager.RefreshSection(SectionName); 该事件有触发,但是并没有触发AppSettingsSectionBuilder类的ProcessConfigurationSection来刷新配置

客户端连接Apollo失败是否会重试重连

   您好,我有一个.Net Core的应用,配置中心是Apollo的,有一个疑问,就是当.Net应用第一次启动
时(本地没有Apollo的配置文件),由于某些原因.Net客户端和Apollo服务器网络是不通的,此时.Net
应用和Apollo无法建立长连接,也无法加载Apollo的配置。然后过一会网络通了,
.Net Core的应用所在的环境也能和Apollo通了,但是Apollo的客户端不会尝试重连Apollo,
也就是当应用第一次启动时,无法没有成功连接Apollo,就不会再次重连,
导致应用无法加载配置,请问这种问题是我配置的问题,
还是Apollo客户端有什么配置可以让Apollo客户端一直重连Apollo服务器?
    .NetCore版本为2.1
    Apollo客户端1.3.1

ConfigService 挂了,重启配置不能同步问题

场景:在使用apollo.net 客户端的时候,如ConfigService 挂了,在这期间使用portal发布新的配置(提示发布成功,实例列表会提示应用使用非最新的配置),重新启用ConfigService,等待服务正常,但是客户端拉取后依旧没有更新到最新的配置,但是portal 实例列表提示以及使用最新的配置了;
问题所在:客户端在执行拉取任务中,在执行GetConfig()时,会先判断_syncException,如果有异常就会直接抛出,如下图:
image

所以在ConfigService 挂掉,再重新启动这个_syncException 异常没有及时的清除,查找了一下,看到(如下图)
image
这里在同步配置的时候没有及时的清除_syncException,导致更新不了
结果:我尝试及时的清除_syncException,表现正常,希望能尽快解决整个问题(不知道java客户端是否也有整个问题);

appsettings.json Env不起作用

{ "Apollo": { "AppId": "netcore", "MetaServer": "http://10.2.2.139:8080", "Env": "Pro", "ConfigServer": [ "http://10.2.2.140:8080/" ] } }

配置如上,但是获取的配置还是DEV的。Env节点不起作用

.net 客户端,AddNameSpace导致TCP链接过多,阿波罗服务器资源耗尽!

1、我们公司因为命名空间比较多,所以用了AddNameSpace方法,然后发现每次都会触发StartLongPolling方法建立长连接,每台服务器常年保持TCP链接数在1.2万,多了以后会导致阿波罗资源耗尽,
2、java客户端RemoteConfigLongPollService用的是单例,但是在.net客户端中每次都new 一个。
麻烦大佬看看是否真的有问题,能否优化~

Demo中.net core 2.2初始化配置的时候取不到apollo配置节点内容

原代码:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((cotnext, builder) =>
{
// cotnext.Configuration.GetSection("apollo") 读取不到
builder.AddApollo(cotnext.Configuration.GetSection("apollo"))
.AddDefault(ConfigFileFormat.Xml)
.AddDefault(ConfigFileFormat.Json)
.AddDefault(ConfigFileFormat.Yml)
.AddDefault(ConfigFileFormat.Yaml)
.AddDefault();
})
.UseStartup();
修改后代码:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((cotnext, builder) =>
{
// builder.Build().GetSection("apollo") 可以读取
builder.AddApollo(builder.Build().GetSection("apollo"))
.AddDefault(ConfigFileFormat.Xml)
.AddDefault(ConfigFileFormat.Json)
.AddDefault(ConfigFileFormat.Yml)
.AddDefault(ConfigFileFormat.Yaml)
.AddDefault();
})
.UseStartup();

内网客户端程序请求配置超时

我同一个程序在本地是可以得到配置信息的,但把程序移到另一台服务器后就提示请求超时了
[Warn] Long polling failed, will retry in 120 seconds. appId: parttask, cluster: dev, names
pace: application, long polling url: , reason: Get config services failed from http://192.168.5.141:
8080//services/config?appId=parttask&ip=192.168.5.244 [Cause: Could not complete get operation [Caus
e: 操作已超时。]]
image
实例中95是我本地的客户端
想问一下我可以从什么方面检查是什么问题导致请求不到配置

I tried to run abnormally in docker running in host network mode.

  • Base framework: .Net Core 2.1.2

  • Running environment: Centos 7 or ubuntu 18.04 、docker 18.06.0-ce

  • Exception

Unhandled Exception: System.InvalidOperationException: Failed to create instance of type 'Com.Ctrip.Framework.Apollo.ApolloOptions'. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.TypeInitializationException: The type initializer for 'Com.Ctrip.Framework.Apollo.Foundation.NetworkInterfaceManager' threw an exception. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address
at System.Net.Dns.InternalGetHostByName(String hostName)
at System.Net.Dns.GetHostEntry(String hostNameOrAddress)
at Com.Ctrip.Framework.Apollo.Foundation.NetworkInterfaceManager.Refresh()
at Com.Ctrip.Framework.Apollo.Foundation.NetworkInterfaceManager..cctor()
--- End of inner exception stack trace ---
at Com.Ctrip.Framework.Apollo.Foundation.NetworkInterfaceManager.get_HostIp()
at Com.Ctrip.Framework.Apollo.ApolloOptions..ctor()
--- End of inner exception stack trace ---
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean wrapExceptions, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean skipCheckThis, Boolean fillCache)
at Microsoft.Extensions.Configuration.ConfigurationBinder.CreateInstance(Type type)
--- End of inner exception stack trace ---
at Microsoft.Extensions.Configuration.ConfigurationBinder.CreateInstance(Type type)
at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
at Microsoft.Extensions.Configuration.ConfigurationBinder.Get(IConfiguration configuration, Type type, Action`1 configureOptions)
at Microsoft.Extensions.Configuration.ConfigurationBinder.Get[T](IConfiguration configuration, Action`1 configureOptions)
at Microsoft.Extensions.Configuration.ConfigurationBinder.Get[T](IConfiguration configuration)
at FabricDemo.UserService.Program.<>c.<CreateWebHostBuilder>b__1_0(WebHostBuilderContext hostingContext, IConfigurationBuilder builder) in /src/src/FabricDemo.UserService/Program.cs:line 25
at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at FabricDemo.UserService.Program.Main(String[] args) in /src/src/FabricDemo.UserService/Program.cs:line 15
  • with the following the steps to reproduce:
  1. appsettings.json
{
  "apollo": {
    "AppId": "FabricDemo.UserService",
    "MetaServer": "http://pro.meta-server.zengql.local"
  }
}
  1. program.cs
/// <inheritdoc />
public class Program
{
	/// <inheritdoc />
	public static void Main(string[] args)
	{
		CreateWebHostBuilder(args).Build().Run();
	}

	/// <inheritdoc />
	public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
		WebHost.CreateDefaultBuilder(args)
			.ConfigureAppConfiguration(
				(hostingContext, builder) =>
				{
					builder.AddApollo(builder.Build().GetSection("apollo"))
						.AddDefault()
						.AddNamespace("TEST1.ConsulPublic");
				})
			.UseStartup<Startup>();
}
  1. dockerfile
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 54045

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY src/FabricDemo.UserService/FabricDemo.UserService.csproj src/FabricDemo.UserService/
RUN dotnet restore src/FabricDemo.UserService/FabricDemo.UserService.csproj
COPY . .
WORKDIR /src/src/FabricDemo.UserService
RUN dotnet build FabricDemo.UserService.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish FabricDemo.UserService.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "FabricDemo.UserService.dll"]
  1. docker-compose.yml
version: '3'

services:
  userservice:
    container_name: userservice
    image: fabricdemo/userservice:${TAG:-latest}
    build:
      context: .
      dockerfile: src/FabricDemo.UserService/Dockerfile
    network_mode: host
    restart: always
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://127.0.0.1:54045
    ports:
      - "54045:54045"

Start command: docker-compose up --build

Please give a solution, thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.