initial docker (#964)

diff --git a/README.md b/README.md
index ab096a2..1195fd0 100644
--- a/README.md
+++ b/README.md
@@ -12,78 +12,114 @@
 
 ![index](https://raw.githubusercontent.com/apache/dubbo-admin/develop/doc/images/index.png)
 
-# 1 Quick start
-There are 4 methods to run Dubbo Admin in production:
+There are four ways to deploy Dubbo Admin to a production environment
 
-1. [Run With Helm (Recommended)](#11-Run-With-Helm)
-2. [Run With Kubernetes](#12-Run-With-Kubernetes)
-3. [Run With Docker](#13-Run-With-Docker)
-4. [Run From Source Code](#14-Compile-From-Source)
+1. [Linux with Admin](#11-linux-with-admin)
+2. [Docker with Admin](#12-docker-with-admin)
+3. [Kubernetes with Admin](#13-kubernetes-with-admin)
+4. [Helm with Admin](#14-helm-with-admin)
 
-You can choose any of the above methods to run Admin based on your environment. Helm is recommended if your plan to run Admin in a Kubernetes cluster because it will have all the dependencies managed with only one command.
+Choose either method based on your environment, where Helm is the recommended installation method because Helm can be installed with a single click and automatically helps manage all of Admin's required production environment dependencies.
 
-## 1.1 Run With Helm
+## 1.1 Linux with Admin
 
-There are two ways to deploy Dubbo Admin with helm depending on how you get the helm chart resources, both of them have the same effect.
+1. Download code: `git clone https://github.com/apache/dubbo-admin.git`
+2. `dubbo-admin-server/src/main/resources/application.properties` Designated Registration Center Address
+3. Build
+    - `mvn clean package -Dmaven.test.skip=true`
+4. Start
+    * `mvn --projects dubbo-admin-server spring-boot:run`
+      or
+    * `cd dubbo-admin-distribution/target; java -jar dubbo-admin-${project.version}.jar`
+5. Visit  `http://localhost:38080`
 
-### 1.1.1 Run from helm chart sources
-**1. Get helm chart sources**
+## 1.2 Docker with Admin
+Admin image hosting at: https://hub.docker.com/repository/docker/apache/dubbo-admin
 
-Clone the Dubbo Admin repo:
+modify `application.properties` File default parameters,For example, address of registration center and configuration center, Get the address through 'docker inspect',172.17.0.2 is the registration center address of zookeeper.
+```
+  admin.registry.address: zookeeper://172.17.0.2:2181
+  admin.config-center: zookeeper://172.17.0.2:2181
+  admin.metadata-report.address: zookeeper://172.17.0.2:2181
+```
+docker start
+```sh
+$ docker run -p 38080:38080 --name dubbo-admin -d dubbo-admin
+```
+
+Visit `http://localhost:38080`
+
+## 1.3 Kubernetes with Admin
+
+**1. Download Kubernetes manifests**
+```sh
+$ git clone https://github.com/apache/dubbo-admin.git
+```
+
+Switch to the 'deploy/k8s' directory to see the Admin kubernetes resource file
+```sh
+$ cd /dubbo-admin/deploy/kubernetes
+```
+
+**2. Install Dubbo Admin**
+
+modify [application.properties](./dubbo-admin-server/src/main/resources/application.properties)  Parameter configuration in `configmap.yaml` ,Just define the parameters to be overwritten。
+
+Run the following command:
+
+```sh
+$ kubectl apply -f ./
+```
+
+**3. Visit Admin**
+```sh
+$ kubectl port-forward service dubbo-admin 38080:38080
+```
+
+Visit `http://localhost:38080`
+
+
+## 1.4 Helm with Admin
+There are two ways to run Admin through Help. They have the same effect, so you can choose any of the following.
+
+### 1.4.1 Run Admin based on Chart source file
+**1. Download chart source file**
+
+clone Dubbo Admin project storehouse:
 
 ```sh
 $ git clone https://github.com/apache/dubbo-admin.git
 ```
 
-From the repo's root directory, change your working directory to `deploy/helm/dubbo-admin`
+Switch from the warehouse root directory to the following directory `deploy/charts/dubbo-admin`
+
 ```sh
-$ cd /dubbo-admin/deploy/helm/dubbo-admin
+$ cd dubbo-admin/deploy/charts/dubbo-admin
 ```
 **2. Install helm chart**
 
+Start parameters of Admin so that Admin can connect to the real production environment registry or configuration center. You can specify a custom configuration file through the following `-f` help parameter:
+```yaml
+properties:
+  admin.registry.address: zookeeper://zookeeper:2181
+  admin.config-center: zookeeper://zookeeper:2181
+  admin.metadata-report.address: zookeeper://zookeeper:2181
+```
+
+`zookeeper://zookeeper:2181`  Visit address of the Kubernetes Cluster registration center zookeeper。
 ```sh
-$ helm install dubbo-admin .
+$ helm install dubbo-admin -f values.yaml .
 ```
 
-Or, if you need to customize the configuration Admin uses to let it connecting to the real registries or configuration centers, specify a customized configuration file using the `-f` helm option, for example, the following `value file` specifies registry, config-center and metadata addresses:
+`properties` The content specified in the field will be overwritten Admin [application.properties](./dubbo-admin-server/src/main/resources/application.properties) Specified default configuration,In addition to 'properties', you can customize other properties defined by Admin help chart,Here is available[Complete parameters](./deploy/helm/dubbo-admin/values.yaml)。
 
-Content of `properties.xml`:
+**3. Visit Admin**
 
-```xml
-properties: |
-  admin.registry.address=zookeeper://30.221.144.85:2181
-  admin.config-center=zookeeper://30.221.144.85:2181
-  admin.metadata-report.address=zookeeper://30.221.144.85:2181
-```
+Visit http://127.0.0.1:38080
 
-`zookeeper://30.221.144.85:2181` should be a real address that is accessible from inside the kubernetes cluster.
+### 1.4.2 Run Admin based on Chart warehouse
 
-```sh
-$ helm install dubbo-admin -f properties.yaml .
-```
-
-The values specified in `properties` will override those in [application.properties](./dubbo-admin-server/src/main/resources/application.properties) of the Admin image. Despite `properties`, you can also set other values defined by Dubbo Admin helm.
-
-**3. Visit Dubbo Admin**
-
-Dubbo Admin should now has been successfully installed, run the following command:
-
-```sh
-$ kubectl --namespace default port-forward service/dubbo-admin 38080:38080
-```
-
-Or, you can choose to follow the command instructions from the helm installation process, it should be similar to the following:
-```sh
-export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=dubbo-admin,app.kubernetes.io/instance=dubbo-admin" -o jsonpath="{.items[0].metadata.name}")
-export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
-echo "Visit http://127.0.0.1:38080 to use your application"
-kubectl --namespace default port-forward $POD_NAME 38080:$CONTAINER_PORT
-```
-
-Open browser and visit http://127.0.0.1:38080, default username and password are `root`
-
-### 1.1.2 Run from helm chart repository
-**1. Add helm chart repository (Currently not available)**
+**1. Add helm chart  (Temporarily unavailable)**
 
 ```sh
 $ helm repo add dubbo-charts https://dubbo.apache.org/dubbo-charts
@@ -95,7 +131,7 @@
 $ helm install dubbo-admin dubbo-charts/dubbo-admin
 ```
 
-Check the corresponding chapter in [1.1.1 Run from helm chart sources](111-Run-from-helm-chart-sources) to see how to customize helm value.
+reference resources [1.4.1 Run Admin based on Chart warehouse](1.4.1-Run-from-helm-chart-sources) Learn how to customize installation parameters.
 
 ```sh
 $ helm install dubbo-admin -f properties.yaml dubbo-charts/dubbo-admin
@@ -103,65 +139,13 @@
 
 **3. Visit Dubbo Admin**
 
-Dubbo Admin should now has been successfully installed, run the following command:
+Dubbo Admin Now that the installation should be successful, run the following command to obtain the access address:
 
 ```sh
 $ kubectl --namespace default port-forward service/dubbo-admin 38080:38080
 ```
 
-Open browser and visit http://127.0.0.1:38080, default username and password are `root`
-
-## 1.2 Run With Kubernetes
-
-**1. Get Kubernetes manifests**
-```sh
-$ git clone https://github.com/apache/dubbo-admin.git
-```
-
-All we need from this step is the Admin kubernetes manifests in `deploy/k8s`
-
-But before you can apply the manifests, override the default value defined in [application.properties](./dubbo-admin-server/src/main/resources/application.properties) by adding items in `configmap.yaml`.
-
-```sh
-$ cd /dubbo-admin/deploy/kubernetes
-```
-
-**2. Deploy Dubbo Admin**
-```sh
-# Change configuration in ./deploy/application.yml before apply if necessary
-$ kubectl apply -f ./
-```
-
-**3. Visit Admin**
-```sh
-$ kubectl port-forward service dubbo-admin 38080:38080
-```
-
-Open web browser and visit `http://localhost:38080`, default username and password are `root`
-
-## 1.3 Run With Docker
-The prebuilt docker image is hosted at: https://hub.docker.com/repository/docker/apache/dubbo-admin
-
-You can run the image directly by mounting a volume from the host that contains an `application.properties` file with the accessible registry and config-center addresses specified.
-
-```sh
-$ docker run -it --rm -v /the/host/path/containing/properties:/config -p 38080:38080 apache/dubbo-admin
-```
-
-Replace `/the/host/path/containing/properties` with the actual host path (must be an absolute path) that points to a directory containing `application.properties`.
-
-Open web browser and visit `http://localhost:38080`, default username and password are `root`
-
-## 1.4 Compile From Source
-1. Clone source code on `develop` branch `git clone https://github.com/apache/dubbo-admin.git`
-2. Specify registry address in `dubbo-admin-server/src/main/resources/application.properties`
-3. Build
-    - `mvn clean package -Dmaven.test.skip=true`
-4. Start
-    * `mvn --projects dubbo-admin-server spring-boot:run`
-    OR
-    * `cd dubbo-admin-distribution/target`;   `java -jar dubbo-admin-0.1.jar`
-5. Visit `http://localhost:38080`, default username and password are `root`
+Visit http://127.0.0.1:38080
 
 # 2. Want To Contribute
 
diff --git a/README_ZH.md b/README_ZH.md
index e9a5f33..6417758 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -10,78 +10,114 @@
 
 ![index](https://raw.githubusercontent.com/apache/dubbo-admin/develop/doc/images/index.png)
 
-# 快速开始
 
-有四种将 Dubbo Admin 部署到生产环境的方式:
+有四种将 Dubbo Admin 部署到生产环境的方式
 
-1. [基于 Helm 运行 Admin (推荐)](#11-使用-Helm-文件)
-2. [基于 Kubernetes 运行 Admin](#12-使用-Kubernetes-文件)
-3. [基于 Docker 运行 Admin](#13-使用-Docker-文件)
-4. [基于源码打包运行 Admin](#14-通过源码打包运行)
+1. [Linux 运行 Admin](#11-linux-运行-admin)
+2. [Docker 运行 Admin](#12-docker-运行-admin)
+3. [Kubernetes 运行 Admin](#13-kubernetes-运行-admin)
+4. [Helm 运行 Admin](#14-helm-运行-admin)
 
-你可以基于自己的环境选择任一方式,其中,Helm 是推荐的安装方式,因为 Helm 可以做到一键安装,自动帮助管理所有 Admin 必须的生产环境依赖。
+基于环境选择任一方式,其中,Helm 是推荐的安装方式,因为 Helm 可以做到一键安装,自动帮助管理所有 Admin 必须的生产环境依赖。
 
-## 1.1 使用 Helm 运行
+## 1.1 Linux 运行 Admin
+
+1. 下载代码: `git clone https://github.com/apache/dubbo-admin.git`
+2. 在 `dubbo-admin-server/src/main/resources/application.properties`中指定注册中心地址
+3. 构建
+    - `mvn clean package -Dmaven.test.skip=true`
+4. 启动
+    * `mvn --projects dubbo-admin-server spring-boot:run`
+      或者
+    * `cd dubbo-admin-distribution/target; java -jar dubbo-admin-${project.version}.jar`
+5. 访问 `http://localhost:38080`
+
+## 1.2 Docker 运行 Admin
+ Admin 镜像托管在: https://hub.docker.com/repository/docker/apache/dubbo-admin
+
+ 修改 `application.properties` 文件默认参数,如注册中心、配置中心地址等, 通过 `docker inspect` 获取地址,172.17.0.2 是 zookeeper 的注册中心地址
+```
+  admin.registry.address: zookeeper://172.17.0.2:2181
+  admin.config-center: zookeeper://172.17.0.2:2181
+  admin.metadata-report.address: zookeeper://172.17.0.2:2181
+```
+
+```sh
+$ docker run -p 38080:38080 --name dubbo-admin -d dubbo-admin
+```
+
+打开浏览器并访问 `http://localhost:38080`
+
+## 1.3 Kubernetes 运行 Admin
+
+**1. 下载 Kubernetes manifests**
+```sh
+$ git clone https://github.com/apache/dubbo-admin.git
+```
+
+切换到 `deploy/k8s` 目录可以看到 Admin kubernetes 资源文件
+```sh
+$ cd /dubbo-admin/deploy/kubernetes
+```
+
+**2. 部署 Dubbo Admin**
+
+修改 [application.properties](./dubbo-admin-server/src/main/resources/application.properties)  `configmap.yaml` 中的参数配置,只定义要覆盖参数即可。
+
+执行以下命令:
+
+```sh
+$ kubectl apply -f ./
+```
+
+**3. 访问 Admin**
+```sh
+$ kubectl port-forward service dubbo-admin 38080:38080
+```
+
+打开浏览器并访问 `http://localhost:38080`
+
+
+## 1.4 Helm 运行 Admin
 通过 Helm 运行 Admin 有两种方式,它们起到相同的效果,因此可以选择以下任意一种。
 
-### 1.1.1 基于 Chart 源文件运行 Admin
+### 1.4.1 基于 Chart 源文件运行 Admin
 **1. 下载 chart 源文件**
 
-克隆 Dubbo Admin 仓库源码:
+克隆 Dubbo Admin 项目仓库:
 
 ```sh
 $ git clone https://github.com/apache/dubbo-admin.git
 ```
 
-从仓库根目录切换到以下目录 `deploy/helm/dubbo-admin`
+从仓库根目录切换到以下目录 `deploy/charts/dubbo-admin`
 
 ```sh
-$ cd dubbo-admin/deploy/helm/dubbo-admin
+$ cd dubbo-admin/deploy/charts/dubbo-admin
 ```
 **2. 安装 helm chart**
 
+Admin 的启动参数,以便让 Admin 连接到真实的生产环境注册中心或配置中心,可以通过以下 `-f` helm 参数指定自定义配置文件:
+
+```yaml
+properties:
+  admin.registry.address: zookeeper://zookeeper:2181
+  admin.config-center: zookeeper://zookeeper:2181
+  admin.metadata-report.address: zookeeper://zookeeper:2181
+```
+
+`zookeeper://zookeeper:2181`  Kubernetes 集群注册中心 zookeeper 的访问地址。
 ```sh
-$ helm install dubbo-admin .
+$ helm install dubbo-admin -f values.yaml .
 ```
 
-或者,如果你想定制 Admin 的启动参数,以便让 Admin 连接到真实的生产环境注册中心或配置中心,可以通过以下 `-f` helm 参数指定自定义配置文件:
-
-properties.xml
-
-```xml
-properties: |
-  admin.registry.address=zookeeper://30.221.144.85:2181
-  admin.config-center=zookeeper://30.221.144.85:2181
-  admin.metadata-report.address=zookeeper://30.221.144.85:2181
-```
-
-`zookeeper://30.221.144.85:2181` 是可以在 Kubernetes 集群内被访问到的真实地址。
-
-```sh
-$ helm install dubbo-admin -f properties.yaml .
-```
-
-`properties` 字段指定的内容将会覆盖 Admin 镜像中 [application.properties](./dubbo-admin-server/src/main/resources/application.properties) 指定的默认配置,除了 `properties` 之外,还可以定制 Admin helm chart 定义的其他属性,这里是可供使用的[完整参数](./deploy/helm/dubbo-admin/values.yaml)。
+`properties` 字段指定的内容将会覆盖 Admin [application.properties](./dubbo-admin-server/src/main/resources/application.properties) 指定的默认配置,除了 `properties` 之外,还可以定制 Admin helm chart 定义的其他属性,这里是可供使用的[完整参数](./deploy/helm/dubbo-admin/values.yaml)。
 
 **3. 访问 Admin**
 
-Dubbo Admin 现在应该已经成功安装,运行以下命令获得访问地址:
+打开浏览器并访问 http://127.0.0.1:38080
 
-```sh
-$ kubectl --namespace default port-forward service/dubbo-admin 38080:38080
-```
-
-或者,你可以参考执行 helm 安装后给出的提示命令,类似如下:
-```sh
-export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=dubbo-admin,app.kubernetes.io/instance=dubbo-admin" -o jsonpath="{.items[0].metadata.name}")
-export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
-echo "Visit http://127.0.0.1:38080 to use your application"
-kubectl --namespace default port-forward $POD_NAME 38080:$CONTAINER_PORT
-```
-
-打开浏览器并访问 http://127.0.0.1:38080,默认的 username 和 password 是 `root`
-
-### 1.1.2 基于 Chart 仓库运行 Admin
+### 1.4.2 基于 Chart 仓库运行 Admin
 
 **1. 添加 helm chart 仓库 (暂时不可用)**
 
@@ -109,61 +145,7 @@
 $ kubectl --namespace default port-forward service/dubbo-admin 38080:38080
 ```
 
-打开浏览器并访问 http://127.0.0.1:38080,默认的 username 和 password 是 `root`
-
-## 1.2 使用 Kubernetes 运行
-
-**1. 下载 Kubernetes manifests**
-```sh
-$ git clone https://github.com/apache/dubbo-admin.git
-```
-
-切换到 `deploy/k8s` 目录可以看到 Admin kubernetes 资源文件
-```sh
-$ cd /dubbo-admin/deploy/kubernetes
-```
-
-**2. 部署 Dubbo Admin**
-
-首先,请参照[application.properties](./dubbo-admin-server/src/main/resources/application.properties) 修改 `configmap.yml` 中的参数配置,只定义要覆盖参数即可。
-
-执行以下命令:
-
-```sh
-$ kubectl apply -f ./
-```
-
-**3. 访问 Admin**
-```sh
-$ kubectl port-forward service dubbo-admin 38080:38080
-```
-
-打开浏览器并访问 `http://localhost:38080`, 默认 username 和 password 是 `root`
-
-## 1.3 使用 Docker 运行
-预先定义的 Admin 镜像托管在: https://hub.docker.com/repository/docker/apache/dubbo-admin
-
-可以直接运行镜像来部署 Admin,并通过绑定宿主机上的 `application.properties` 文件定制镜像默认参数,如注册中心、配置中心地址等。
-
-```sh
-$ docker run -it --rm -v /the/host/path/containing/properties:/config -p 38080:38080 apache/dubbo-admin
-```
-
-将 `/the/host/path/containing/properties` 替换为宿主机上包含 `application.properties` 文件的实际路径(必须是一个有效目录的绝对路径)。
-
-打开浏览器并访问 `http://localhost:38080`, 默认 username 和 password 是 `root`
-
-## 1.4 通过源码打包运行
-
-1. 下载代码: `git clone https://github.com/apache/dubbo-admin.git`
-2. 在 `dubbo-admin-server/src/main/resources/application.properties`中指定注册中心地址
-3. 构建
-    - `mvn clean package -Dmaven.test.skip=true`
-4. 启动
-    * `mvn --projects dubbo-admin-server spring-boot:run`
-    或者
-    * `cd dubbo-admin-distribution/target; java -jar dubbo-admin-${project.version}.jar`
-5. 访问 `http://localhost:38080`
+打开浏览器并访问 http://127.0.0.1:38080
 
 # 2 参与项目贡献
 
diff --git a/deploy/charts/dubbo-admin/Chart.yaml b/deploy/charts/dubbo-admin/Chart.yaml
index 7a7f5f4..a412fd6 100644
--- a/deploy/charts/dubbo-admin/Chart.yaml
+++ b/deploy/charts/dubbo-admin/Chart.yaml
@@ -1,5 +1,5 @@
 apiVersion: v2
-appVersion: 3.1.5
+appVersion: 3.1.6
 name: dubbo-admin
 description: Distributed application monitoring and management platform.
 home: https://cn.dubbo.apache.org
diff --git a/deploy/charts/dubbo-admin/README.md b/deploy/charts/dubbo-admin/README.md
index 250de97..13c8196 100644
--- a/deploy/charts/dubbo-admin/README.md
+++ b/deploy/charts/dubbo-admin/README.md
@@ -1,11 +1,14 @@
+## 1. Project download to local
 ```
 git clone https://github.com/apache/dubbo-admin.git
 ```
 
+## 2. Switch project directory
 ```
-cd dubbo-admin/deploy/helm
+cd dubbo-admin/deploy/charts/dubbo-admin
 ```
 
+## 3. Install dubbo-admin
 ```
 helm install dubbo-admin -f values.yaml .
 ```
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/NOTES.txt b/deploy/charts/dubbo-admin/templates/NOTES.txt
index ca484a3..1bb1f8e 100644
--- a/deploy/charts/dubbo-admin/templates/NOTES.txt
+++ b/deploy/charts/dubbo-admin/templates/NOTES.txt
@@ -1,22 +1,55 @@
-1. Get the application URL by running these commands:
-{{- if .Values.ingress.enabled }}
-{{- range $host := .Values.ingress.hosts }}
-  {{- range .paths }}
-  http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
-  {{- end }}
+CHART NAME: {{ .Chart.Name }}
+CHART VERSION: {{ .Chart.Version }}
+APP VERSION: {{ .Chart.AppVersion }}
+
+1.  Get your '{{ .Chart.Name }}' by running:
+
+   kubectl get deploy {{ include "dubbo-admin.fullname" . }} -n {{ include "dubbo-admin.namespace" . }}
+
+2. Login Dubbo-admin default user and password:
+   **********************************************
+               USERNAME: root
+               PASSWORD: root
+   **********************************************
+
+3. The Dubbo-admin server can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster:
+
+       {{ include "dubbo-admin.fullname" . }}.{{ include "dubbo-admin.namespace" . }}.svc.cluster.local
+
+   {{ if .Values.ingress.enabled }}
+   If you bind Dubbo-admin to 38080, please update values in values.yaml and reinstall:
+
+   From outside the cluster, the server URL(s) are:
+     {{- range .Values.ingress.hosts }}
+     http://{{ . }}
+     {{- end }}
+   {{- else }}
+4. Get the Dubbo-admin URL to visit by running these commands in the same shell:
+   {{- if contains "NodePort" .Values.service.type }}
+     export NODE_PORT=$(kubectl get --namespace {{ include "dubbo-admin.namespace" . }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "dubbo-admin.fullname" . }})
+
+     export NODE_IP=$(kubectl get nodes --namespace {{ include "dubbo-admin.namespace" . }} -o jsonpath="{.items[0].status.addresses[0].address}")
+
+     echo http://$NODE_IP:$NODE_PORT
+   {{- else if contains "LoadBalancer" .Values.service.type }}
+   NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+        You can watch the status of by running 'kubectl get svc --namespace {{ include "dubbo-admin.namespace" . }} -w {{ include "dubbo-admin.fullname" . }}'
+
+     export SERVICE_IP=$(kubectl get svc --namespace {{ include "dubbo-admin.namespace" . }} {{ include "dubbo-admin.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+
+     http://$SERVICE_IP:{{ .Values.service.port -}}
+   {{- else if contains "ClusterIP"  .Values.service.type }}
+
+     export POD_NAME=$(kubectl get pods --namespace {{ include "dubbo-admin.namespace" . }} -l "app.kubernetes.io/name={{ include "dubbo-admin.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+
+     kubectl --namespace {{ include "dubbo-admin.namespace" . }} port-forward $POD_NAME 38080
+   {{- end }}
 {{- end }}
-{{- else if contains "NodePort" .Values.service.type }}
-  export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "dubbo-admin.fullname" . }})
-  export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
-  echo http://$NODE_IP:$NODE_PORT
-{{- else if contains "LoadBalancer" .Values.service.type }}
-     NOTE: It may take a few minutes for the LoadBalancer IP to be available.
-           You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "dubbo-admin.fullname" . }}'
-  export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "dubbo-admin.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
-  echo http://$SERVICE_IP:{{ .Values.service.port }}
-{{- else if contains "ClusterIP" .Values.service.type }}
-  export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "dubbo-admin.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
-  export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
-  echo "Visit http://127.0.0.1:8080 to use your application"
-  kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
-{{- end }}
+
+
+{{- if not .Values.persistence.enabled }}
+#################################################################################
+######   WARNING: Persistence is disabled!!! You will lose your data when   #####
+######            the Dubbo-admin pod is terminated.                        #####
+#################################################################################
+{{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/_helpers.tpl b/deploy/charts/dubbo-admin/templates/_helpers.tpl
index b0a5331..98cdd5a 100644
--- a/deploy/charts/dubbo-admin/templates/_helpers.tpl
+++ b/deploy/charts/dubbo-admin/templates/_helpers.tpl
@@ -6,6 +6,7 @@
 {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
 {{- end -}}
 
+
 {{/*
 Create a default fully qualified app name.
 We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
@@ -24,6 +25,7 @@
 {{- end }}
 {{- end }}
 
+
 {{/*
 Create chart name and version as used by the chart label.
 */}}
@@ -56,6 +58,7 @@
 app.kubernetes.io/managed-by: {{ .Release.Service }}
 {{- end }}
 
+
 {{/*
 Return the appropriate apiVersion for rbac.
 */}}
@@ -68,14 +71,12 @@
 {{- end }}
 
 
-{{/*
-Selector labels
-*/}}
 {{- define "dubbo-admin.selectorLabels" -}}
 app.kubernetes.io/name: {{ include "dubbo-admin.name" . }}
 app.kubernetes.io/instance: {{ .Release.Name }}
 {{- end }}
 
+
 {{/*
 Create the name of the service account to use
 */}}
@@ -87,6 +88,7 @@
 {{- end }}
 {{- end }}
 
+
 {{- define "dubbo-admin.serviceAccountNameTest" -}}
 {{- if .Values.serviceAccount.create }}
 {{- default (print (include "dubbo-admin.fullname" .) "-test") .Values.serviceAccount.nameTest }}
@@ -95,6 +97,7 @@
 {{- end }}
 {{- end }}
 
+
 {{/*
 Formats imagePullSecrets. Input is (dict "root" . "imagePullSecrets" .{specific imagePullSecrets})
 */}}
@@ -107,4 +110,54 @@
 - name: {{ tpl . $root }}
 {{- end }}
 {{- end }}
+{{- end }}
+
+
+{{/*
+Return if ingress is stable.
+*/}}
+{{- define "dubbo-admin.ingress.isStable" -}}
+{{- eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1" }}
+{{- end }}
+
+
+{{/*
+Return if ingress supports ingressClassName.
+*/}}
+{{- define "dubbo-admin.ingress.supportsIngressClassName" -}}
+{{- or (eq (include "dubbo-admin.ingress.isStable" .) "true") (and (eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }}
+{{- end }}
+
+
+{{/*
+Return if ingress supports pathType.
+*/}}
+{{- define "dubbo-admin.ingress.supportsPathType" -}}
+{{- or (eq (include "dubbo-admin.ingress.isStable" .) "true") (and (eq (include "dubbo-admin.ingress.apiVersion" .) "networking.k8s.io/v1beta1") (semverCompare ">= 1.18-0" .Capabilities.KubeVersion.Version)) }}
+{{- end }}
+
+
+{{/*
+Return the appropriate apiVersion for ingress.
+*/}}
+{{- define "dubbo-admin.ingress.apiVersion" -}}
+{{- if and ($.Capabilities.APIVersions.Has "networking.k8s.io/v1") (semverCompare ">= 1.19-0" .Capabilities.KubeVersion.Version) }}
+{{- print "networking.k8s.io/v1" }}
+{{- else if $.Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }}
+{{- print "networking.k8s.io/v1beta1" }}
+{{- else }}
+{{- print "extensions/v1beta1" }}
+{{- end }}
+{{- end }}
+
+
+{{/*
+Return the appropriate apiVersion for podDisruptionBudget.
+*/}}
+{{- define "dubbo-admin.podDisruptionBudget.apiVersion" -}}
+{{- if $.Capabilities.APIVersions.Has "policy/v1/PodDisruptionBudget" }}
+{{- print "policy/v1" }}
+{{- else }}
+{{- print "policy/v1beta1" }}
+{{- end }}
 {{- end }}
\ No newline at end of file
diff --git a/deploy/charts/dubbo-admin/templates/deployment.yaml b/deploy/charts/dubbo-admin/templates/deployment.yaml
index d4fcbd1..57057be 100644
--- a/deploy/charts/dubbo-admin/templates/deployment.yaml
+++ b/deploy/charts/dubbo-admin/templates/deployment.yaml
@@ -53,9 +53,12 @@
             - name: {{ .Values.service.name }}
               containerPort: {{ .Values.service.containerPort }}
           volumeMounts:
-            - mountPath: {{ .Values.volumeMounts.mountPath }}
-              name: {{ .Values.volumeMounts.name }}
-              readOnly: {{ .Values.volumeMounts.readOnly }}
+            - mountPath: /config
+              name: application-properties
+              readOnly: true
+            - mountPath: /storage
+              name: storage
+              readOnly: true
           livenessProbe:
             httpGet:
               path: {{ .Values.livenessProbe.httpGet.path }}
@@ -74,9 +77,30 @@
             periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
             successThreshold: {{ .Values.readinessProbe.successThreshold }}
             failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
+          startupProbe:
+            httpGet:
+              path: {{ .Values.startupProbe.httpGet.path }}
+              port: {{ .Values.startupProbe.httpGet.port }}
+            initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }}
+            timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }}
+            periodSeconds: {{ .Values.startupProbe.periodSeconds }}
+            successThreshold: {{ .Values.startupProbe.successThreshold }}
+            failureThreshold: {{ .Values.startupProbe.failureThreshold }}
           resources:
             {{- toYaml .Values.resources | nindent 12 }}
       volumes:
-        - name: {{ .Values.volumes.name }}
+        - name: application-properties
           secret:
-            secretName: {{ .Chart.Name }}
\ No newline at end of file
+            secretName: {{ include "dubbo-admin.fullname" . }}-secret
+        - name: storage
+             {{- if .Values.persistence.enabled }}
+          persistentVolumeClaim:
+            {{ if .Values.persistence.ClaimName }}
+            claimName: {{ .Values.persistence.ClaimName }}
+            {{- else -}}
+          emptyDir: {{- if .Values.persistence.emptyDir.sizeLimit }}
+              sizeLimit: {{ .Values.persistence.emptyDir.sizeLimit }}
+             {{- else }} {}
+              {{- end -}}
+              {{- end -}}
+            {{- end -}}
diff --git a/deploy/charts/dubbo-admin/templates/ingress.yaml b/deploy/charts/dubbo-admin/templates/ingress.yaml
index 3b15118..9fe91f0 100644
--- a/deploy/charts/dubbo-admin/templates/ingress.yaml
+++ b/deploy/charts/dubbo-admin/templates/ingress.yaml
@@ -1,61 +1,78 @@
 {{- if .Values.ingress.enabled -}}
+{{- $ingressApiIsStable := eq (include "dubbo-admin.ingress.isStable" .) "true" -}}
+{{- $ingressSupportsIngressClassName := eq (include "dubbo-admin.ingress.supportsIngressClassName" .) "true" -}}
+{{- $ingressSupportsPathType := eq (include "dubbo-admin.ingress.supportsPathType" .) "true" -}}
 {{- $fullName := include "dubbo-admin.fullname" . -}}
-{{- $svcPort := .Values.service.port -}}
-{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
-  {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
-  {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
-  {{- end }}
-{{- end }}
-{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
-apiVersion: networking.k8s.io/v1
-{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
-apiVersion: networking.k8s.io/v1beta1
-{{- else -}}
-apiVersion: extensions/v1beta1
-{{- end }}
+{{- $servicePort := .Values.service.port -}}
+{{- $ingressPath := .Values.ingress.path -}}
+{{- $ingressPathType := .Values.ingress.pathType -}}
+{{- $extraPaths := .Values.ingress.extraPaths -}}
+apiVersion: {{ include "dubbo-admin.ingress.apiVersion" . }}
 kind: Ingress
 metadata:
   name: {{ $fullName }}
+  namespace: {{ include "dubbo-admin.namespace" . }}
   labels:
     {{- include "dubbo-admin.labels" . | nindent 4 }}
+    {{- with .Values.ingress.labels }}
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
   {{- with .Values.ingress.annotations }}
   annotations:
-    {{- toYaml . | nindent 4 }}
-  {{- end }}
-spec:
-  {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
-  ingressClassName: {{ .Values.ingress.className }}
-  {{- end }}
-  {{- if .Values.ingress.tls }}
-  tls:
-    {{- range .Values.ingress.tls }}
-    - hosts:
-        {{- range .hosts }}
-        - {{ . | quote }}
-        {{- end }}
-      secretName: {{ .secretName }}
+    {{- range $key, $value := . }}
+    {{ $key }}: {{ tpl $value $ | quote }}
     {{- end }}
   {{- end }}
+spec:
+  {{- if and $ingressSupportsIngressClassName .Values.ingress.ingressClassName }}
+  ingressClassName: {{ .Values.ingress.ingressClassName }}
+  {{- end -}}
+  {{- with .Values.ingress.tls }}
+  tls:
+    {{- tpl (toYaml .) $ | nindent 4 }}
+  {{- end }}
   rules:
-    {{- range .Values.ingress.hosts }}
-    - host: {{ .host | quote }}
+  {{- if .Values.ingress.hosts  }}
+  {{- range .Values.ingress.hosts }}
+    - host: {{ tpl . $ }}
       http:
         paths:
-          {{- range .paths }}
-          - path: {{ .path }}
-            {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
-            pathType: {{ .pathType }}
+          {{- with $extraPaths }}
+          {{- toYaml . | nindent 10 }}
+          {{- end }}
+          - path: {{ $ingressPath }}
+            {{- if $ingressSupportsPathType }}
+            pathType: {{ $ingressPathType }}
             {{- end }}
             backend:
-              {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
+              {{- if $ingressApiIsStable }}
               service:
                 name: {{ $fullName }}
                 port:
-                  number: {{ $svcPort }}
+                  number: {{ $servicePort }}
               {{- else }}
               serviceName: {{ $fullName }}
-              servicePort: {{ $svcPort }}
+              servicePort: {{ $servicePort }}
               {{- end }}
-          {{- end }}
-    {{- end }}
+  {{- end }}
+  {{- else }}
+    - http:
+        paths:
+          - backend:
+              {{- if $ingressApiIsStable }}
+              service:
+                name: {{ $fullName }}
+                port:
+                  number: {{ $servicePort }}
+              {{- else }}
+              serviceName: {{ $fullName }}
+              servicePort: {{ $servicePort }}
+              {{- end }}
+            {{- with $ingressPath }}
+            path: {{ . }}
+            {{- end }}
+            {{- if $ingressSupportsPathType }}
+            pathType: {{ $ingressPathType }}
+            {{- end }}
+  {{- end -}}
 {{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/networkpolicy.yaml b/deploy/charts/dubbo-admin/templates/networkpolicy.yaml
new file mode 100644
index 0000000..70f3e8a
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/networkpolicy.yaml
@@ -0,0 +1,52 @@
+{{- if .Values.networkPolicy.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}
+  namespace: {{ include "dubbo-admin.namespace" . }}
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+    {{- with .Values.labels }}
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+  {{- with .Values.annotations }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+spec:
+  policyTypes:
+    {{- if .Values.networkPolicy.ingress }}
+    - Ingress
+    {{- end }}
+    {{- if .Values.networkPolicy.egress.enabled }}
+    - Egress
+    {{- end }}
+  podSelector:
+    matchLabels:
+      {{- include "dubbo-admin.selectorLabels" . | nindent 6 }}
+
+  {{- if .Values.networkPolicy.egress.enabled }}
+  egress:
+    - ports:
+        {{ .Values.networkPolicy.egress.ports | toJson }}
+  {{- end }}
+  {{- if .Values.networkPolicy.ingress }}
+  ingress:
+    - ports:
+        - port: {{ .Values.service.targetPort }}
+      {{- if not .Values.networkPolicy.allowExternal }}
+      from:
+        - podSelector:
+            matchLabels:
+              {{ include "dubbo-admin.fullname" . }}-client: "true"
+        {{- with .Values.networkPolicy.explicitNamespacesSelector }}
+        - namespaceSelector:
+            {{- toYaml . | nindent 12 }}
+        {{- end }}
+        - podSelector:
+            matchLabels:
+              {{- include "dubbo-admin.labels" . | nindent 14 }}
+              role: read
+      {{- end }}
+  {{- end }}
+{{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/poddisruptionbudget.yaml b/deploy/charts/dubbo-admin/templates/poddisruptionbudget.yaml
new file mode 100644
index 0000000..86809fe
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/poddisruptionbudget.yaml
@@ -0,0 +1,20 @@
+apiVersion: {{ include "dubbo-admin.podDisruptionBudget.apiVersion" . }}
+kind: PodDisruptionBudget
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}
+  namespace: {{ include "dubbo-admin.namespace" . }}
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+    {{- with .Values.labels }}
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+spec:
+  {{- with .Values.podDisruptionBudget.minAvailable }}
+  minAvailable: {{ . }}
+  {{- end }}
+  {{- with .Values.podDisruptionBudget.maxUnavailable }}
+  maxUnavailable: {{ . }}
+  {{- end }}
+  selector:
+    matchLabels:
+      {{- include "dubbo-admin.selectorLabels" . | nindent 6 }}
diff --git a/deploy/charts/dubbo-admin/templates/podsecuritypolicy.yaml b/deploy/charts/dubbo-admin/templates/podsecuritypolicy.yaml
new file mode 100644
index 0000000..e2b830f
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/podsecuritypolicy.yaml
@@ -0,0 +1,39 @@
+{{- if and .Values.rbac.pspEnabled (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") }}
+apiVersion: policy/v1beta1
+kind: PodSecurityPolicy
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+spec:
+  privileged: false
+  allowPrivilegeEscalation: false
+  requiredDropCapabilities:
+    - ALL
+  volumes:
+    - 'configMap'
+    - 'emptyDir'
+    - 'projected'
+    - 'csi'
+    - 'secret'
+    - 'downwardAPI'
+    - 'persistentVolumeClaim'
+  hostNetwork: false
+  hostIPC: false
+  hostPID: false
+  runAsUser:
+    rule: 'RunAsAny'
+  seLinux:
+    rule: 'RunAsAny'
+  supplementalGroups:
+    rule: 'MustRunAs'
+    ranges:
+      - min: 1
+        max: 65535
+  fsGroup:
+    rule: 'MustRunAs'
+    ranges:
+      - min: 1
+        max: 65535
+  readOnlyRootFilesystem: false
+{{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/pvc.yaml b/deploy/charts/dubbo-admin/templates/pvc.yaml
new file mode 100644
index 0000000..80a2565
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/pvc.yaml
@@ -0,0 +1,36 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.ClaimName) (eq .Values.persistence.type "pvc")}}
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}
+  namespace: {{ include "dubbo-admin.namespace" . }}
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+    {{- with .Values.persistence.extraPvcLabels }}
+    {{- toYaml . | nindent 4 }}
+    {{- end }}
+  {{- with .Values.persistence.annotations  }}
+  annotations:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+  {{- with .Values.persistence.finalizers  }}
+  finalizers:
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+spec:
+  accessModes:
+    {{- range .Values.persistence.accessModes }}
+    - {{ . | quote }}
+    {{- end }}
+  resources:
+    requests:
+      storage: {{ .Values.persistence.size | quote }}
+  {{- with .Values.persistence.storageClassName }}
+  storageClassName: {{ . }}
+  {{- end }}
+  {{- with .Values.persistence.selectorLabels }}
+  selector:
+    matchLabels:
+    {{- toYaml . | nindent 6 }}
+  {{- end }}
+{{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/secret.yaml b/deploy/charts/dubbo-admin/templates/secret.yaml
index f296bee..e18ce8c 100644
--- a/deploy/charts/dubbo-admin/templates/secret.yaml
+++ b/deploy/charts/dubbo-admin/templates/secret.yaml
@@ -1,10 +1,9 @@
 apiVersion: v1
 kind: Secret
 metadata:
-  name: {{ .Chart.Name }}
+  name: {{ include "dubbo-admin.fullname" . }}-secret
   namespace: {{ include "dubbo-admin.namespace" . }}
   labels:
     {{- include "dubbo-admin.labels" . | nindent 4 }}
-  type: Opaque
 data:
   application.properties: {{ tpl (toYaml .Values.properties) . | b64enc }}
diff --git a/deploy/charts/dubbo-admin/templates/svc-headless.yaml b/deploy/charts/dubbo-admin/templates/svc-headless.yaml
index 224b05e..6776177 100644
--- a/deploy/charts/dubbo-admin/templates/svc-headless.yaml
+++ b/deploy/charts/dubbo-admin/templates/svc-headless.yaml
@@ -8,7 +8,7 @@
     {{- include "dubbo-admin.labels" . | nindent 4 }}
 spec:
   {{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }}
-  type: ClusterIP
+  type: {{ .Values.service.type }}
   clusterIP: None
   {{- else if eq .Values.service.type "LoadBalancer" }}
   type: {{ .Values.service.type }}
diff --git a/deploy/charts/dubbo-admin/templates/svc.yaml b/deploy/charts/dubbo-admin/templates/svc.yaml
index 4697b68..7771dc6 100644
--- a/deploy/charts/dubbo-admin/templates/svc.yaml
+++ b/deploy/charts/dubbo-admin/templates/svc.yaml
@@ -8,7 +8,7 @@
     {{- include "dubbo-admin.labels" . | nindent 4 }}
 spec:
   {{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }}
-  type: ClusterIP
+  type: {{ .Values.service.type }}
   {{- with .Values.service.clusterIP }}
   clusterIP: {{ . }}
   {{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/tests/test-role.yaml b/deploy/charts/dubbo-admin/templates/tests/test-role.yaml
new file mode 100644
index 0000000..c7f8995
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tests/test-role.yaml
@@ -0,0 +1,21 @@
+{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}-test
+  namespace: {{ include "dubbo-admin.namespace" . }}
+  annotations:
+    "helm.sh/hook": test-success
+    "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded"
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+rules:
+  - apiGroups:
+      - extensions
+    resources:
+      - podsecuritypolicies
+    verbs:
+      - use
+    resourceNames:
+      - {{ include "dubbo-admin.fullname" . }}-test
+{{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/tests/test-rolebinding.yaml b/deploy/charts/dubbo-admin/templates/tests/test-rolebinding.yaml
new file mode 100644
index 0000000..6f01922
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tests/test-rolebinding.yaml
@@ -0,0 +1,20 @@
+{{- if and (.Capabilities.APIVersions.Has "policy/v1beta1/PodSecurityPolicy") .Values.testFramework.enabled .Values.rbac.pspEnabled }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}-test
+  namespace: {{ include "dubbo-admin.namespace" . }}
+  annotations:
+    "helm.sh/hook": test-success
+    "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded"
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+roleRef:
+  apiGroup: rbac.authorization.k8s.io
+  kind: Role
+  name: {{ include "dubbo-admin.fullname" . }}-test
+subjects:
+  - kind: ServiceAccount
+    name: {{ include "dubbo-admin.serviceAccountNameTest" . }}
+    namespace: {{ include "dubbo-admin.namespace" . }}
+{{- end }}
diff --git a/deploy/charts/dubbo-admin/templates/tests/test-secret.yaml b/deploy/charts/dubbo-admin/templates/tests/test-secret.yaml
new file mode 100644
index 0000000..2fd8384
--- /dev/null
+++ b/deploy/charts/dubbo-admin/templates/tests/test-secret.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Secret
+metadata:
+  name: {{ include "dubbo-admin.fullname" . }}-secret-test
+  namespace: {{ include "dubbo-admin.namespace" . }}
+  annotations:
+    "helm.sh/hook": test-success
+    "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded"
+  labels:
+    {{- include "dubbo-admin.labels" . | nindent 4 }}
+  type: Opaque
+data:
+  application.properties: {{ tpl (toYaml .Values.properties) . | b64enc }}-test
diff --git a/deploy/charts/dubbo-admin/templates/tests/test.yaml b/deploy/charts/dubbo-admin/templates/tests/test.yaml
index dd44ee8..95ca164 100644
--- a/deploy/charts/dubbo-admin/templates/tests/test.yaml
+++ b/deploy/charts/dubbo-admin/templates/tests/test.yaml
@@ -43,7 +43,7 @@
           readOnly: true
   volumes:
     - name: tests
-      configMap:
-        name: {{ include "dubbo-admin.fullname" . }}-test
+      secret:
+        secretName: {{ include "dubbo-admin.fullname" . }}-secret
   restartPolicy: Never
 {{- end }}
diff --git a/deploy/charts/dubbo-admin/values.yaml b/deploy/charts/dubbo-admin/values.yaml
index 5417cd8..b7b2d38 100644
--- a/deploy/charts/dubbo-admin/values.yaml
+++ b/deploy/charts/dubbo-admin/values.yaml
@@ -1,41 +1,48 @@
+## global.imageRegistry Global Docker image registry
+## global.imagePullSecrets Global Docker registry secret names as an array
+## global.storageClass Global StorageClass for Persistent Volume(s)
+##
 global:
-  # To help compatibility with other charts which use global.imagePullSecrets.
-  # Allow either an array of {name: pullSecret} maps (k8s-style), or an array of strings (more common charts-style).
-  # Can be tempalted.
-  # global:
-  #   imagePullSecrets:
-  #   - name: pullSecret1
-  #   - name: pullSecret2
-  # or
-  # global:
-  #   imagePullSecrets:
-  #   - pullSecret1
-  #   - pullSecret2
+  imageRegistry: ""
+  ## E.g.
+  ## imagePullSecrets:
+  ##   - myRegistryKeySecretName
+  ##
   imagePullSecrets: []
-
-
+  ##
+  ##
+## fullnameOverride String to fully override common.names.fullname template
+##
 fullnameOverride: {}
-
-
+##
+##
+## nameOverride String to partially override common.names.fullname template (will maintain the release name)
+##
 nameOverride: {}
-
-
+##
+##
+## namespaceOverride String to partially override common.names.namespace template
+##
 namespaceOverride: {}
-
-
+##
+##
+## labels String to override common.names.labels template
+##
 labels: {}
-
-
+##
+##
+## annotations String to override common.names.annotations template
+##
 annotations: {}
-
-volumes:
-  name: application-properties
-
-
-volumeMounts:
-  mountPath: /config
-  name: application-properties
-  readOnly: true
+##
+##
+##
+##
+## See `kubectl explain poddisruptionbudget.spec` for more
+## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
+podDisruptionBudget:
+  minAvailable: 1
+  # maxUnavailable: 1
 
 
 rbac:
@@ -54,7 +61,7 @@
   #   resources: []
   #   verbs: []
 
-## serviceAccount
+  ## serviceAccount Name
 serviceAccount:
   create: true
   name:
@@ -63,7 +70,7 @@
   annotations: {}
 
 
-## Number of copies
+## Number of service copies
 replicas: 1
 
 # -- Optional array of imagePullSecrets containing private registry credentials
@@ -90,19 +97,20 @@
 revisionHistoryLimit: 10
 
 
-## See `kubectl explain poddisruptionbudget.spec` for more
-## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
-podDisruptionBudget: {}
-#  minAvailable: 1
-#  maxUnavailable: 1
-
-
 ## See `kubectl explain deployment.spec.strategy` for more
 ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
 deploymentStrategy:
   type: RollingUpdate
 
 
+## @param readinessProbe.enabled Enable readinessProbe on ZooKeeper containers
+## @param readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+## @param readinessProbe.periodSeconds Period seconds for readinessProbe
+## @param readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+## @param readinessProbe.failureThreshold Failure threshold for readinessProbe
+## @param readinessProbe.successThreshold Success threshold for readinessProbe
+## @param readinessProbe.probeCommandTimeout Probe command timeout for readinessProbe
+##
 readinessProbe:
   httpGet:
     path: /
@@ -114,6 +122,14 @@
   failureThreshold: 3
 
 
+## @param livenessProbe.enabled Enable livenessProbe on ZooKeeper containers
+## @param livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+## @param livenessProbe.periodSeconds Period seconds for livenessProbe
+## @param livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+## @param livenessProbe.failureThreshold Failure threshold for livenessProbe
+## @param livenessProbe.successThreshold Success threshold for livenessProbe
+## @param livenessProbe.probeCommandTimeout Probe command timeout for livenessProbe
+##
 livenessProbe:
   httpGet:
     path: /
@@ -124,12 +140,35 @@
   successThreshold: 1
   failureThreshold: 3
 
+## @param startupProbe.enabled Enable startupProbe on ZooKeeper containers
+## @param startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+## @param startupProbe.periodSeconds Period seconds for startupProbe
+## @param startupProbe.timeoutSeconds Timeout seconds for startupProbe
+## @param startupProbe.failureThreshold Failure threshold for startupProbe
+## @param startupProbe.successThreshold Success threshold for startupProbe
+##
+startupProbe:
+  httpGet:
+    path: /
+    port: 8080
+  initialDelaySeconds: 60
+  timeoutSeconds: 30
+  periodSeconds: 10
+  successThreshold: 1
+  failureThreshold: 3
 
+
+## Dubbo-admin image version
 image:
   repository: apache/dubbo-admin
   tag: "0.5.0"
+  ##
+  ## Specify a imagePullPolicy
+  ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
+  ## ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
+  ##
   pullPolicy: IfNotPresent
-
+  ##
   ## Optionally specify an array of imagePullSecrets.
   ## Secrets must be manually created in the namespace.
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
@@ -139,11 +178,13 @@
   #   - RegisterKeySecretName
 
 
+## Configure Pods Security Context
 securityContext:
   # runAsUser: 570
   # runAsGroup: 570
   # fsGroup: 570
 
+
 testFramework:
   enabled: true
   image: busybox
@@ -152,6 +193,7 @@
   securityContext: {}
 
 
+## Init container Security Context
 containerSecurityContext: {}
 
 
@@ -159,6 +201,7 @@
 ## This can be useful for auth tokens, etc
 envRenderSecret: {}
 
+
 # -- `minReadySeconds` to avoid killing pods before we are ready
 ##
 minReadySeconds: 0
@@ -167,9 +210,11 @@
 ##
 
 
+## Create or not configmap
 createConfigmap: true
 
 
+## configmap mounts
 ConfigmapMounts: []
   # - name: configMap-file
   #   mountPath: /config
@@ -177,13 +222,14 @@
   #   readOnly: true
 
 
+## secret mounts
 SecretMounts:
 #  - name: secret-file
 #    secret:
 #      secretName: secret-file
 
 
-##
+## extraSecret Mounts
 extraSecretMounts: []
   # - name: secret-files
   #   mountPath: /etc/secrets
@@ -192,14 +238,13 @@
   #   subPath: ""
 
 
-##
+## emptyDir mounts
 EmptyDirMounts: []
 # - name: ""
 #   mountPath: /
 
 
-##
-# Apply extra labels to common labels.
+## Apply extra labels to common labels.
 extraLabels: {}
 
 
@@ -319,6 +364,7 @@
   #    hosts:
   #      - chart-example.local
 
+
 resources: {}
 #  limits:
 #    cpu: 100m
@@ -327,26 +373,31 @@
 #    cpu: 100m
 #    memory: 128Mi
 
+
 ## Node labels for pod assignment
 ## ref: https://kubernetes.io/docs/user-guide/node-selection/
 #
 nodeSelector: {}
 
+
 ## Tolerations for pod assignment
 ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
 ##
 tolerations: []
 
+
 ## Affinity for pod assignment (evaluated as template)
 ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
 ##
 affinity: {}
 
+
 ## Topology Spread Constraints
 ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
 ##
 topologySpreadConstraints: []
 
+
 ## Additional init containers (evaluated as template)
 ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
 ##
@@ -359,18 +410,18 @@
 persistence:
   enabled: false
   type: pvc
-  # storageClassName: default
+  storageClassName: {}
   accessModes:
     - ReadWriteOnce
   size: 10Gi
-  # annotations: {}
+  annotations: {}
   finalizers:
     - kubernetes.io/pvc-protection
-  # selectorLabels: {}
+  selectorLabels: {}
   ## Sub-directory of the PV to mount. Can be templated.
   # subPath: ""
   ## Name of an existing PVC. Can be templated.
-  # existingClaim:
+  ClaimName: {}
   ## Extra labels to apply to a PVC.
   extraPvcLabels: {}
 
@@ -384,6 +435,11 @@
     ## here and the sum of memory limits of all containers in a pod
     ##
     # sizeLimit: 300Mi
+  emptyDir:
+    ## dubbo-admin emptyDir volume size limit
+    ##
+    sizeLimit: ""
+
 
 initChownData:
   ## If false, data ownership will not be reset at startup
@@ -476,6 +532,25 @@
       ## - port: 80
       ## - port: 443
 
+## dubbo-admin-server/src/main/resources/application.properties
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
 properties:
   admin.registry.address: zookeeper://zookeeper:2181
   admin.config-center: zookeeper://zookeeper:2181
diff --git a/docker/0.1.0/Dockerfile b/docker/0.1.0/Dockerfile
index fef03d7..70c6c7d 100644
--- a/docker/0.1.0/Dockerfile
+++ b/docker/0.1.0/Dockerfile
@@ -13,13 +13,14 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-FROM openjdk:8-jdk
+FROM maven:3-openjdk-8
 RUN mkdir /source && wget https://github.com/apache/dubbo-admin/archive/0.1.zip && unzip 0.1.zip -d /source
 WORKDIR /source/dubbo-admin-0.1
-RUN ./mvnw clean package -Dmaven.test.skip=true
+COPY application.properties dubbo-admin-server/src/main/resources/application.properties
+RUN mvn clean package -Dmaven.test.skip=true
 
-FROM openjdk:8-jre
+FROM openjdk:8-jdk
 LABEL maintainer="dev@dubbo.apache.org"
 COPY --from=0 /source/dubbo-admin-0.1/dubbo-admin-distribution/target/dubbo-admin-0.1.jar /app.jar
-ENTRYPOINT ["java","-XX:+UnlockExperimentalVMOptions","-XX:+UseCGroupMemoryLimitForHeap","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
+ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
 EXPOSE 8080
diff --git a/docker/0.1.0/Dockerfile.test b/docker/0.1.0/Dockerfile.test
new file mode 100644
index 0000000..dee4d1d
--- /dev/null
+++ b/docker/0.1.0/Dockerfile.test
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM ubuntu:trusty
+RUN apt-get update && apt-get install -yq curl && apt-get clean
+
+WORKDIR /app
+
+ADD test.sh /app/test.sh
+
+CMD ["bash", "test.sh"]
\ No newline at end of file
diff --git a/docker/0.1.0/application.properties b/docker/0.1.0/application.properties
new file mode 100644
index 0000000..0dbfa07
--- /dev/null
+++ b/docker/0.1.0/application.properties
@@ -0,0 +1,87 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+server.port=38080
+dubbo.protocol.port=30880
+dubbo.application.qos-port=32222
+
+# centers in dubbo2.7, if you want to add parameters, please add them to the url
+admin.registry.address=zookeeper://172.17.0.2:2181
+admin.config-center=zookeeper://172.17.0.2:2181
+admin.metadata-report.address=zookeeper://172.17.0.2:2181
+
+# nacos config, add parameters to url like username=nacos&password=nacos
+#admin.registry.address=nacos://127.0.0.1:8848?group=DEFAULT_GROUP&namespace=public
+#admin.config-center=nacos://127.0.0.1:8848?group=dubbo
+#admin.metadata-report.address=nacos://127.0.0.1:8848?group=dubbo
+
+#group (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.group=dubbo
+#admin.config-center.group=dubbo
+#admin.metadata-report.group=dubbo
+
+#namespace used by nacos. (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.namespace=public
+#admin.config-center.namespace=public
+#admin.metadata-report.namespace=public
+
+admin.root.user.name=root
+admin.root.user.password=root
+
+#session timeout, default is one hour
+admin.check.sessionTimeoutMilli=3600000
+
+
+# apollo config
+# admin.config-center = apollo://localhost:8070?token=e16e5cd903fd0c97a116c873b448544b9d086de9&app.id=test&env=dev&cluster=default&namespace=dubbo
+
+# (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
+#admin.apollo.appId=test
+#admin.apollo.env=dev
+#admin.apollo.cluster=default
+#admin.apollo.namespace=dubbo
+
+#compress
+server.compression.enabled=true
+server.compression.mime-types=text/css,text/javascript,application/javascript
+server.compression.min-response-size=10240
+
+#token timeout, default is one hour
+admin.check.tokenTimeoutMilli=3600000
+#Jwt signingKey
+admin.check.signSecret=86295dd0c4ef69a1036b0b0c15158d77
+
+#dubbo config
+dubbo.application.name=dubbo-admin
+dubbo.registry.address=${admin.registry.address}
+
+# mysql
+#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/dubbo-admin?characterEncoding=utf8&connectTimeout=1000&socketTimeout=10000&autoReconnect=true
+#spring.datasource.username=root
+#spring.datasource.password=mysql
+
+# h2
+spring.datasource.url=jdbc:h2:mem:~/dubbo-admin;MODE=MYSQL;
+spring.datasource.username=sa
+spring.datasource.password=
+
+# id generate type
+mybatis-plus.global-config.db-config.id-type=none
+
+dubbo.application.logger=slf4j
\ No newline at end of file
diff --git a/docker/0.1.0/docker-compose.test.yml b/docker/0.1.0/docker-compose.test.yml
new file mode 100644
index 0000000..9ac7fec
--- /dev/null
+++ b/docker/0.1.0/docker-compose.test.yml
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+zookeeper:
+  image: zookeeper:3.5
+admin:
+  build: .
+  dockerfile: Dockerfile
+  links:
+    - zookeeper
+  environment:
+    - admin.registry.address=zookeeper://zookeeper:2181
+    - admin.config-center=zookeeper://zookeeper:2181
+    - admin.metadata-report.address=zookeeper://zookeeper:2181
+  ports: 
+    - 8080
+sut:
+  build: .
+  dockerfile: Dockerfile.test
+  links:
+    - admin
\ No newline at end of file
diff --git a/docker/0.1.0/test.sh b/docker/0.1.0/test.sh
new file mode 100644
index 0000000..d342e35
--- /dev/null
+++ b/docker/0.1.0/test.sh
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOOP_SIZE=60
+i=0
+
+while [[ $i -lt LOOP_SIZE ]]; do
+	status_code=$(curl --write-out %{http_code} --silent --output /dev/null http://admin:8080)
+
+  if [[ "$status_code" -eq 200 ]] ; then
+    echo "Tests passed!"
+    exit 0
+  else
+    curl -v http://admin:8080
+    echo "status is incorrect, waiting for next turn"
+  fi
+	sleep 5
+	i=$i+1
+done
+
+echo "Tests failed!"
+exit 1
\ No newline at end of file
diff --git a/docker/0.2.0/Dockerfile b/docker/0.2.0/Dockerfile
index 180865b..750e01e 100644
--- a/docker/0.2.0/Dockerfile
+++ b/docker/0.2.0/Dockerfile
@@ -16,10 +16,11 @@
 FROM maven:3-openjdk-8
 RUN mkdir /source && wget https://github.com/apache/dubbo-admin/archive/0.2.0.zip && unzip -q 0.2.0.zip -d /source
 WORKDIR /source/dubbo-admin-0.2.0
+COPY application.properties dubbo-admin-server/src/main/resources/application.properties
 RUN mvn --batch-mode clean package -Dmaven.test.skip=true
 
-FROM openjdk:8-jre
+FROM openjdk:8-jdk
 LABEL maintainer="dev@dubbo.apache.org"
 COPY --from=0 /source/dubbo-admin-0.2.0/dubbo-admin-distribution/target/dubbo-admin-0.2.0.jar /app.jar
-ENTRYPOINT ["java","-XX:+UnlockExperimentalVMOptions","-XX:+UseCGroupMemoryLimitForHeap","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
+ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
 EXPOSE 8080
diff --git a/docker/0.2.0/Dockerfile.test b/docker/0.2.0/Dockerfile.test
new file mode 100644
index 0000000..dee4d1d
--- /dev/null
+++ b/docker/0.2.0/Dockerfile.test
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+FROM ubuntu:trusty
+RUN apt-get update && apt-get install -yq curl && apt-get clean
+
+WORKDIR /app
+
+ADD test.sh /app/test.sh
+
+CMD ["bash", "test.sh"]
\ No newline at end of file
diff --git a/docker/0.2.0/application.properties b/docker/0.2.0/application.properties
new file mode 100644
index 0000000..0dbfa07
--- /dev/null
+++ b/docker/0.2.0/application.properties
@@ -0,0 +1,87 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+server.port=38080
+dubbo.protocol.port=30880
+dubbo.application.qos-port=32222
+
+# centers in dubbo2.7, if you want to add parameters, please add them to the url
+admin.registry.address=zookeeper://172.17.0.2:2181
+admin.config-center=zookeeper://172.17.0.2:2181
+admin.metadata-report.address=zookeeper://172.17.0.2:2181
+
+# nacos config, add parameters to url like username=nacos&password=nacos
+#admin.registry.address=nacos://127.0.0.1:8848?group=DEFAULT_GROUP&namespace=public
+#admin.config-center=nacos://127.0.0.1:8848?group=dubbo
+#admin.metadata-report.address=nacos://127.0.0.1:8848?group=dubbo
+
+#group (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.group=dubbo
+#admin.config-center.group=dubbo
+#admin.metadata-report.group=dubbo
+
+#namespace used by nacos. (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.namespace=public
+#admin.config-center.namespace=public
+#admin.metadata-report.namespace=public
+
+admin.root.user.name=root
+admin.root.user.password=root
+
+#session timeout, default is one hour
+admin.check.sessionTimeoutMilli=3600000
+
+
+# apollo config
+# admin.config-center = apollo://localhost:8070?token=e16e5cd903fd0c97a116c873b448544b9d086de9&app.id=test&env=dev&cluster=default&namespace=dubbo
+
+# (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
+#admin.apollo.appId=test
+#admin.apollo.env=dev
+#admin.apollo.cluster=default
+#admin.apollo.namespace=dubbo
+
+#compress
+server.compression.enabled=true
+server.compression.mime-types=text/css,text/javascript,application/javascript
+server.compression.min-response-size=10240
+
+#token timeout, default is one hour
+admin.check.tokenTimeoutMilli=3600000
+#Jwt signingKey
+admin.check.signSecret=86295dd0c4ef69a1036b0b0c15158d77
+
+#dubbo config
+dubbo.application.name=dubbo-admin
+dubbo.registry.address=${admin.registry.address}
+
+# mysql
+#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/dubbo-admin?characterEncoding=utf8&connectTimeout=1000&socketTimeout=10000&autoReconnect=true
+#spring.datasource.username=root
+#spring.datasource.password=mysql
+
+# h2
+spring.datasource.url=jdbc:h2:mem:~/dubbo-admin;MODE=MYSQL;
+spring.datasource.username=sa
+spring.datasource.password=
+
+# id generate type
+mybatis-plus.global-config.db-config.id-type=none
+
+dubbo.application.logger=slf4j
\ No newline at end of file
diff --git a/docker/0.2.0/docker-compose.test.yml b/docker/0.2.0/docker-compose.test.yml
new file mode 100644
index 0000000..9ac7fec
--- /dev/null
+++ b/docker/0.2.0/docker-compose.test.yml
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+zookeeper:
+  image: zookeeper:3.5
+admin:
+  build: .
+  dockerfile: Dockerfile
+  links:
+    - zookeeper
+  environment:
+    - admin.registry.address=zookeeper://zookeeper:2181
+    - admin.config-center=zookeeper://zookeeper:2181
+    - admin.metadata-report.address=zookeeper://zookeeper:2181
+  ports: 
+    - 8080
+sut:
+  build: .
+  dockerfile: Dockerfile.test
+  links:
+    - admin
\ No newline at end of file
diff --git a/docker/0.2.0/test.sh b/docker/0.2.0/test.sh
new file mode 100644
index 0000000..d342e35
--- /dev/null
+++ b/docker/0.2.0/test.sh
@@ -0,0 +1,34 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOOP_SIZE=60
+i=0
+
+while [[ $i -lt LOOP_SIZE ]]; do
+	status_code=$(curl --write-out %{http_code} --silent --output /dev/null http://admin:8080)
+
+  if [[ "$status_code" -eq 200 ]] ; then
+    echo "Tests passed!"
+    exit 0
+  else
+    curl -v http://admin:8080
+    echo "status is incorrect, waiting for next turn"
+  fi
+	sleep 5
+	i=$i+1
+done
+
+echo "Tests failed!"
+exit 1
\ No newline at end of file
diff --git a/docker/0.3.0/Dockerfile b/docker/0.3.0/Dockerfile
index ac31116..9ceb206 100644
--- a/docker/0.3.0/Dockerfile
+++ b/docker/0.3.0/Dockerfile
@@ -16,9 +16,10 @@
 FROM maven:3-openjdk-8
 RUN mkdir /source && wget https://github.com/apache/dubbo-admin/archive/0.3.0.zip && unzip -q 0.3.0.zip -d /source
 WORKDIR /source/dubbo-admin-0.3.0
+COPY application.properties dubbo-admin-server/src/main/resources/application.properties
 RUN mvn --batch-mode clean package -Dmaven.test.skip=true
 
-FROM openjdk:8-jre
+FROM openjdk:8-jdk
 LABEL maintainer="dev@dubbo.apache.org"
 RUN apt-get update && apt-get install -y tini
 COPY --from=0 /source/dubbo-admin-0.3.0/dubbo-admin-distribution/target/dubbo-admin-0.3.0.jar /app.jar
diff --git a/docker/0.3.0/application.properties b/docker/0.3.0/application.properties
new file mode 100644
index 0000000..0dbfa07
--- /dev/null
+++ b/docker/0.3.0/application.properties
@@ -0,0 +1,87 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+server.port=38080
+dubbo.protocol.port=30880
+dubbo.application.qos-port=32222
+
+# centers in dubbo2.7, if you want to add parameters, please add them to the url
+admin.registry.address=zookeeper://172.17.0.2:2181
+admin.config-center=zookeeper://172.17.0.2:2181
+admin.metadata-report.address=zookeeper://172.17.0.2:2181
+
+# nacos config, add parameters to url like username=nacos&password=nacos
+#admin.registry.address=nacos://127.0.0.1:8848?group=DEFAULT_GROUP&namespace=public
+#admin.config-center=nacos://127.0.0.1:8848?group=dubbo
+#admin.metadata-report.address=nacos://127.0.0.1:8848?group=dubbo
+
+#group (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.group=dubbo
+#admin.config-center.group=dubbo
+#admin.metadata-report.group=dubbo
+
+#namespace used by nacos. (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.namespace=public
+#admin.config-center.namespace=public
+#admin.metadata-report.namespace=public
+
+admin.root.user.name=root
+admin.root.user.password=root
+
+#session timeout, default is one hour
+admin.check.sessionTimeoutMilli=3600000
+
+
+# apollo config
+# admin.config-center = apollo://localhost:8070?token=e16e5cd903fd0c97a116c873b448544b9d086de9&app.id=test&env=dev&cluster=default&namespace=dubbo
+
+# (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
+#admin.apollo.appId=test
+#admin.apollo.env=dev
+#admin.apollo.cluster=default
+#admin.apollo.namespace=dubbo
+
+#compress
+server.compression.enabled=true
+server.compression.mime-types=text/css,text/javascript,application/javascript
+server.compression.min-response-size=10240
+
+#token timeout, default is one hour
+admin.check.tokenTimeoutMilli=3600000
+#Jwt signingKey
+admin.check.signSecret=86295dd0c4ef69a1036b0b0c15158d77
+
+#dubbo config
+dubbo.application.name=dubbo-admin
+dubbo.registry.address=${admin.registry.address}
+
+# mysql
+#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/dubbo-admin?characterEncoding=utf8&connectTimeout=1000&socketTimeout=10000&autoReconnect=true
+#spring.datasource.username=root
+#spring.datasource.password=mysql
+
+# h2
+spring.datasource.url=jdbc:h2:mem:~/dubbo-admin;MODE=MYSQL;
+spring.datasource.username=sa
+spring.datasource.password=
+
+# id generate type
+mybatis-plus.global-config.db-config.id-type=none
+
+dubbo.application.logger=slf4j
\ No newline at end of file
diff --git a/docker/0.4.0/Dockerfile b/docker/0.4.0/Dockerfile
index 621959c..c29162d 100644
--- a/docker/0.4.0/Dockerfile
+++ b/docker/0.4.0/Dockerfile
@@ -16,9 +16,10 @@
 FROM maven:3-openjdk-8
 RUN mkdir /source && wget https://github.com/apache/dubbo-admin/archive/0.4.0.zip && unzip -q 0.4.0.zip -d /source
 WORKDIR /source/dubbo-admin-0.4.0
+COPY application.properties dubbo-admin-server/src/main/resources/application.properties
 RUN mvn --batch-mode clean package -Dmaven.test.skip=true
 
-FROM openjdk:8-jre
+FROM openjdk:8-jdk
 LABEL maintainer="dev@dubbo.apache.org"
 RUN apt-get update && apt-get install -y tini
 COPY --from=0 /source/dubbo-admin-0.4.0/dubbo-admin-distribution/target/dubbo-admin-0.4.0.jar /app.jar
diff --git a/docker/0.4.0/application.properties b/docker/0.4.0/application.properties
new file mode 100644
index 0000000..0dbfa07
--- /dev/null
+++ b/docker/0.4.0/application.properties
@@ -0,0 +1,87 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+server.port=38080
+dubbo.protocol.port=30880
+dubbo.application.qos-port=32222
+
+# centers in dubbo2.7, if you want to add parameters, please add them to the url
+admin.registry.address=zookeeper://172.17.0.2:2181
+admin.config-center=zookeeper://172.17.0.2:2181
+admin.metadata-report.address=zookeeper://172.17.0.2:2181
+
+# nacos config, add parameters to url like username=nacos&password=nacos
+#admin.registry.address=nacos://127.0.0.1:8848?group=DEFAULT_GROUP&namespace=public
+#admin.config-center=nacos://127.0.0.1:8848?group=dubbo
+#admin.metadata-report.address=nacos://127.0.0.1:8848?group=dubbo
+
+#group (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.group=dubbo
+#admin.config-center.group=dubbo
+#admin.metadata-report.group=dubbo
+
+#namespace used by nacos. (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.namespace=public
+#admin.config-center.namespace=public
+#admin.metadata-report.namespace=public
+
+admin.root.user.name=root
+admin.root.user.password=root
+
+#session timeout, default is one hour
+admin.check.sessionTimeoutMilli=3600000
+
+
+# apollo config
+# admin.config-center = apollo://localhost:8070?token=e16e5cd903fd0c97a116c873b448544b9d086de9&app.id=test&env=dev&cluster=default&namespace=dubbo
+
+# (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
+#admin.apollo.appId=test
+#admin.apollo.env=dev
+#admin.apollo.cluster=default
+#admin.apollo.namespace=dubbo
+
+#compress
+server.compression.enabled=true
+server.compression.mime-types=text/css,text/javascript,application/javascript
+server.compression.min-response-size=10240
+
+#token timeout, default is one hour
+admin.check.tokenTimeoutMilli=3600000
+#Jwt signingKey
+admin.check.signSecret=86295dd0c4ef69a1036b0b0c15158d77
+
+#dubbo config
+dubbo.application.name=dubbo-admin
+dubbo.registry.address=${admin.registry.address}
+
+# mysql
+#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/dubbo-admin?characterEncoding=utf8&connectTimeout=1000&socketTimeout=10000&autoReconnect=true
+#spring.datasource.username=root
+#spring.datasource.password=mysql
+
+# h2
+spring.datasource.url=jdbc:h2:mem:~/dubbo-admin;MODE=MYSQL;
+spring.datasource.username=sa
+spring.datasource.password=
+
+# id generate type
+mybatis-plus.global-config.db-config.id-type=none
+
+dubbo.application.logger=slf4j
\ No newline at end of file
diff --git a/docker/0.5.0/Dockerfile b/docker/0.5.0/Dockerfile
index 0cf7bcd..ce192e9 100644
--- a/docker/0.5.0/Dockerfile
+++ b/docker/0.5.0/Dockerfile
@@ -16,9 +16,10 @@
 FROM maven:3-openjdk-8
 RUN mkdir /source && wget https://github.com/apache/dubbo-admin/archive/0.5.0.zip && unzip -q 0.5.0.zip -d /source
 WORKDIR /source/dubbo-admin-0.5.0
+COPY application.properties dubbo-admin-server/src/main/resources/application.properties
 RUN mvn --batch-mode clean package -Dmaven.test.skip=true
 
-FROM openjdk:8-jre
+FROM openjdk:8-jdk
 LABEL maintainer="dev@dubbo.apache.org"
 RUN apt-get update && apt-get install -y tini
 COPY --from=0 /source/dubbo-admin-0.5.0/dubbo-admin-distribution/target/dubbo-admin-0.5.0.jar /app.jar
diff --git a/docker/0.5.0/application.properties b/docker/0.5.0/application.properties
new file mode 100644
index 0000000..0dbfa07
--- /dev/null
+++ b/docker/0.5.0/application.properties
@@ -0,0 +1,87 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+server.port=38080
+dubbo.protocol.port=30880
+dubbo.application.qos-port=32222
+
+# centers in dubbo2.7, if you want to add parameters, please add them to the url
+admin.registry.address=zookeeper://172.17.0.2:2181
+admin.config-center=zookeeper://172.17.0.2:2181
+admin.metadata-report.address=zookeeper://172.17.0.2:2181
+
+# nacos config, add parameters to url like username=nacos&password=nacos
+#admin.registry.address=nacos://127.0.0.1:8848?group=DEFAULT_GROUP&namespace=public
+#admin.config-center=nacos://127.0.0.1:8848?group=dubbo
+#admin.metadata-report.address=nacos://127.0.0.1:8848?group=dubbo
+
+#group (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.group=dubbo
+#admin.config-center.group=dubbo
+#admin.metadata-report.group=dubbo
+
+#namespace used by nacos. (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.registry.namespace=public
+#admin.config-center.namespace=public
+#admin.metadata-report.namespace=public
+
+admin.root.user.name=root
+admin.root.user.password=root
+
+#session timeout, default is one hour
+admin.check.sessionTimeoutMilli=3600000
+
+
+# apollo config
+# admin.config-center = apollo://localhost:8070?token=e16e5cd903fd0c97a116c873b448544b9d086de9&app.id=test&env=dev&cluster=default&namespace=dubbo
+
+# (Deprecated it is recommended to use URL to add parameters,will be removed in the future)
+#admin.apollo.token=e16e5cd903fd0c97a116c873b448544b9d086de9
+#admin.apollo.appId=test
+#admin.apollo.env=dev
+#admin.apollo.cluster=default
+#admin.apollo.namespace=dubbo
+
+#compress
+server.compression.enabled=true
+server.compression.mime-types=text/css,text/javascript,application/javascript
+server.compression.min-response-size=10240
+
+#token timeout, default is one hour
+admin.check.tokenTimeoutMilli=3600000
+#Jwt signingKey
+admin.check.signSecret=86295dd0c4ef69a1036b0b0c15158d77
+
+#dubbo config
+dubbo.application.name=dubbo-admin
+dubbo.registry.address=${admin.registry.address}
+
+# mysql
+#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+#spring.datasource.url=jdbc:mysql://localhost:3306/dubbo-admin?characterEncoding=utf8&connectTimeout=1000&socketTimeout=10000&autoReconnect=true
+#spring.datasource.username=root
+#spring.datasource.password=mysql
+
+# h2
+spring.datasource.url=jdbc:h2:mem:~/dubbo-admin;MODE=MYSQL;
+spring.datasource.username=sa
+spring.datasource.password=
+
+# id generate type
+mybatis-plus.global-config.db-config.id-type=none
+
+dubbo.application.logger=slf4j
\ No newline at end of file
diff --git a/docker/latest/Dockerfile b/docker/latest/Dockerfile
deleted file mode 100644
index d9f8696..0000000
--- a/docker/latest/Dockerfile
+++ /dev/null
@@ -1,31 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FROM maven:3-openjdk-8
-RUN mkdir -p /source/dubbo-admin-snapshot
-ADD . /source/dubbo-admin-snapshot
-WORKDIR /source/dubbo-admin-snapshot
-RUN mvn --batch-mode -Prelease clean package -Dmaven.test.skip=true
-
-FROM openjdk:8-jre
-LABEL maintainer="dev@dubbo.apache.org"
-RUN apt-get update && apt-get install -y tini
-COPY --from=0 /source/dubbo-admin-snapshot/dubbo-admin-distribution/target/dubbo-admin-0.5.0-SNAPSHOT.jar /app.jar
-COPY --from=0 /source/dubbo-admin-snapshot/docker/entrypoint.sh /usr/local/bin/entrypoint.sh
-
-ENV JAVA_OPTS "-Dloader.path=/opt-libs"
-
-ENTRYPOINT ["tini", "--", "/usr/local/bin/entrypoint.sh"]
-EXPOSE 8080