diff --git a/Dockerfile b/Dockerfile
index 63d3783f51..07cf8b5e04 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -56,6 +56,6 @@ RUN ldd /usr/local/srs/objs/ffmpeg/bin/ffmpeg && \
 
 # Default workdir and command.
 WORKDIR /usr/local/srs
-ENV SRS_DAEMON=off
+ENV SRS_DAEMON=off SRS_IN_DOCKER=on
 CMD ["./objs/srs", "-c", "conf/docker.conf"]
 
diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md
index e6db4a8e15..94d188e022 100644
--- a/trunk/doc/CHANGELOG.md
+++ b/trunk/doc/CHANGELOG.md
@@ -7,6 +7,7 @@ The changelog for SRS.
 <a name="v6-changes"></a>
 
 ## SRS 6.0 Changelog
+* v6.0, 2023-10-17, Merge [#3758](https://github.com/ossrs/srs/pull/3758): Refine docker detect mechenism. v6.0.90 (#3758)
 * v6.0, 2023-10-11, Merge [#3827](https://github.com/ossrs/srs/pull/3827): Fix bug for upgrading to OpenSSL 3.0. v6.0.89 (#3827)
 * v6.0, 2023-10-10, Merge [#3825](https://github.com/ossrs/srs/pull/3825): SRT: Fix the missing config mss. v6.0.88 (#3825)
 * v6.0, 2023-10-08, Merge [#3824](https://github.com/ossrs/srs/pull/3824): Solve the problem of inaccurate HLS TS duration. v6.0.87 (#3824)
@@ -101,6 +102,7 @@ The changelog for SRS.
 <a name="v5-changes"></a>
 
 ## SRS 5.0 Changelog
+* v5.0, 2023-10-17, Merge [#3758](https://github.com/ossrs/srs/pull/3758): Refine docker detect mechenism. v5.0.190 (#3758)
 * v5.0, 2023-10-11, Merge [#3827](https://github.com/ossrs/srs/pull/3827): Fix bug for upgrading to OpenSSL 3.0. v5.0.189 (#3827)
 * v5.0, 2023-10-10, Merge [#3825](https://github.com/ossrs/srs/pull/3825): SRT: Fix the missing config mss. v5.0.188 (#3825)
 * v5.0, 2023-10-08, Merge [#3824](https://github.com/ossrs/srs/pull/3824): Solve the problem of inaccurate HLS TS duration. v5.0.187 (#3824)
diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp
index 3e03c82a78..172b2eaa33 100644
--- a/trunk/src/app/srs_app_config.cpp
+++ b/trunk/src/app/srs_app_config.cpp
@@ -94,6 +94,38 @@ bool is_common_space(char ch)
     return (ch == ' ' || ch == '\t' || ch == SRS_CR || ch == SRS_LF);
 }
 
+extern bool _srs_in_docker;
+
+// Detect docker by https://stackoverflow.com/a/41559867
+srs_error_t srs_detect_docker()
+{
+    srs_error_t err = srs_success;
+
+    _srs_in_docker = false;
+
+    SrsFileReader fr;
+    if ((err = fr.open("/proc/1/cgroup")) != srs_success) {
+        return err;
+    }
+
+    ssize_t nn;
+    char buf[1024];
+    if ((err = fr.read(buf, sizeof(buf), &nn)) != srs_success) {
+        return err;
+    }
+
+    if (nn <= 0) {
+        return err;
+    }
+
+    string s(buf, nn);
+    if (srs_string_contains(s, "/docker")) {
+        _srs_in_docker = true;
+    }
+
+    return err;
+}
+
 namespace srs_internal
 {
     SrsConfigBuffer::SrsConfigBuffer()
@@ -1934,6 +1966,19 @@ srs_error_t SrsConfig::parse_options(int argc, char** argv)
         if (root->directives.empty()) root->get_or_create("vhost", "__defaultVhost__");
     }
 
+    // Ignore any error while detecting docker.
+    if ((err = srs_detect_docker()) != srs_success) {
+        srs_error_reset(err);
+    }
+
+    // Try to load the config if docker detect failed.
+    if (!_srs_in_docker) {
+        _srs_in_docker = _srs_config->get_in_docker();
+        if (_srs_in_docker) {
+            srs_trace("enable in_docker by config");
+        }
+    }
+
     ////////////////////////////////////////////////////////////////////////
     // check log name and level
     ////////////////////////////////////////////////////////////////////////
@@ -2856,7 +2901,7 @@ string SrsConfig::argv()
 
 bool SrsConfig::get_daemon()
 {
-    SRS_OVERWRITE_BY_ENV_BOOL2("srs.daemon");
+    SRS_OVERWRITE_BY_ENV_BOOL2("srs.daemon"); // SRS_DAEMON
 
     SrsConfDirective* conf = root->get("daemon");
     if (!conf || conf->arg0().empty()) {
@@ -6520,8 +6565,6 @@ string SrsConfig::get_ingest_input_url(SrsConfDirective* conf)
     return conf->arg0();
 }
 
-extern bool _srs_in_docker;
-
 bool SrsConfig::get_log_tank_file()
 {
     if (!srs_getenv("srs.srs_log_tank").empty()) { // SRS_SRS_LOG_TANK
diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp
index c4b5686a05..d6d5b78033 100644
--- a/trunk/src/core/srs_core_version5.hpp
+++ b/trunk/src/core/srs_core_version5.hpp
@@ -9,6 +9,6 @@
 
 #define VERSION_MAJOR       5
 #define VERSION_MINOR       0
-#define VERSION_REVISION    189
+#define VERSION_REVISION    190
 
 #endif
diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp
index a614245bc0..033e1007b6 100644
--- a/trunk/src/core/srs_core_version6.hpp
+++ b/trunk/src/core/srs_core_version6.hpp
@@ -9,6 +9,6 @@
 
 #define VERSION_MAJOR       6
 #define VERSION_MINOR       0
-#define VERSION_REVISION    89
+#define VERSION_REVISION    90
 
 #endif
diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp
index 519b7ef384..6bf06d1d30 100644
--- a/trunk/src/main/srs_main_server.cpp
+++ b/trunk/src/main/srs_main_server.cpp
@@ -57,7 +57,6 @@ using namespace std;
 // pre-declare
 srs_error_t run_directly_or_daemon();
 srs_error_t run_in_thread_pool();
-srs_error_t srs_detect_docker();
 void show_macro_features();
 
 // @global log and context.
@@ -79,6 +78,9 @@ bool _srs_config_by_env = false;
 // The binary name of SRS.
 const char* _srs_binary = NULL;
 
+// @global Other variables.
+bool _srs_in_docker = false;
+
 // Free global data, for address sanitizer.
 extern void srs_free_global_system_ips();
 
@@ -131,11 +133,6 @@ srs_error_t do_main(int argc, char** argv, char** envp)
 #ifdef SRS_GPERF_MP
 #warning "gmp is not used for memory leak, please use gmc instead."
 #endif
-
-    // Ignore any error while detecting docker.
-    if ((err = srs_detect_docker()) != srs_success) {
-        srs_error_reset(err);
-    }
     
     // never use srs log(srs_trace, srs_error, etc) before config parse the option,
     // which will load the log config and apply it.
@@ -400,49 +397,10 @@ void show_macro_features()
 #endif
 }
 
-// Detect docker by https://stackoverflow.com/a/41559867
-bool _srs_in_docker = false;
-srs_error_t srs_detect_docker()
-{
-    srs_error_t err = srs_success;
-
-    _srs_in_docker = false;
-
-    SrsFileReader fr;
-    if ((err = fr.open("/proc/1/cgroup")) != srs_success) {
-        return err;
-    }
-
-    ssize_t nn;
-    char buf[1024];
-    if ((err = fr.read(buf, sizeof(buf), &nn)) != srs_success) {
-        return err;
-    }
-
-    if (nn <= 0) {
-        return err;
-    }
-
-    string s(buf, nn);
-    if (srs_string_contains(s, "/docker")) {
-        _srs_in_docker = true;
-    }
-
-    return err;
-}
-
 srs_error_t run_directly_or_daemon()
 {
     srs_error_t err = srs_success;
 
-    // Try to load the config if docker detect failed.
-    if (!_srs_in_docker) {
-        _srs_in_docker = _srs_config->get_in_docker();
-        if (_srs_in_docker) {
-            srs_trace("enable in_docker by config");
-        }
-    }
-
     // Load daemon from config, disable it for docker.
     // @see https://github.com/ossrs/srs/issues/1594
     bool run_as_daemon = _srs_config->get_daemon();