You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ta...@apache.org on 2019/05/16 01:38:01 UTC

[skywalking] branch master updated: Update docker building tool (#2677)

This is an automated email from the ASF dual-hosted git repository.

tanjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new b76839f  Update docker building tool (#2677)
b76839f is described below

commit b76839fe4ca7d02b3c09c7a66968c3d1e4323d71
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Thu May 16 09:37:56 2019 +0800

    Update docker building tool (#2677)
    
    * Update docker building of oap server
    
     * generating appliation.yml according to enviroment variables
     * adding Makefile to build binary and docker image
    
    * Update ui docker
    
    * Update docker-compose
    
    * Update document
    
    * Update document
    
    * Merge from master
    
    * Reset skywalking-ui
---
 Makefile                                     |  95 ++++++++
 docker/Makefile                              |  31 ---
 docker/README.md                             |  12 --
 docker/config/alarm-settings.yml             |  72 -------
 docker/config/application.yml                | 117 ----------
 docker/config/component-libraries.yml        | 311 ---------------------------
 docker/config/datasource-settings.properties |  31 ---
 docker/config/log4j2.xml                     |  37 ----
 docker/docker-compose.yml                    |  13 +-
 docker/oap/{Dockerfile => Dockerfile.oap}    |   8 +-
 docker/oap/docker-entrypoint.sh              | 226 ++++++++++++++++++-
 docker/ui/{Dockerfile => Dockerfile.ui}      |   6 +-
 docker/ui/docker-entrypoint.sh               |   9 +-
 docs/en/guides/How-to-build.md               |  29 +++
 14 files changed, 372 insertions(+), 625 deletions(-)

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..acb6a85
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,95 @@
+# 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.
+
+
+export SW_ROOT := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
+
+export SW_OUT:=${SW_ROOT}/dist
+
+SKIP_TEST?=false
+
+.PHONY: build.all build.agent build.backend build.ui build.docker
+
+build.all:
+	cd $(SW_ROOT) && ./mvnw clean package -Dmaven.test.skip=$(SKIP_TEST)
+
+build.agent:
+	cd $(SW_ROOT) && ./mvnw clean package -Dmaven.test.skip=$(SKIP_TEST) -Pagent,dist
+
+build.backend:
+	cd $(SW_ROOT) && ./mvnw clean package -Dmaven.test.skip=$(SKIP_TEST) -Pbackend,dist
+
+build.ui:
+	cd $(SW_ROOT) && ./mvnw clean package -Dmaven.test.skip=$(SKIP_TEST) -Pui,dist
+
+build.docker:
+	cd $(SW_ROOT) && ./mvnw clean package -Dmaven.test.skip=$(SKIP_TEST) -Pbackend,ui,dist
+
+DOCKER_BUILD_TOP:=${SW_OUT}/docker_build
+
+HUB?=skywalking
+
+TAG?=latest
+
+.SECONDEXPANSION: #allow $@ to be used in dependency list
+
+.PHONY: docker docker.all docker.oap
+
+docker: build.docker docker.all
+
+DOCKER_TARGETS:=docker.oap docker.ui
+
+docker.all: $(DOCKER_TARGETS)
+
+docker.oap: $(SW_OUT)/apache-skywalking-apm-bin.tar.gz
+docker.oap: $(SW_ROOT)/docker/oap/Dockerfile.oap
+docker.oap: $(SW_ROOT)/docker/oap/docker-entrypoint.sh
+docker.oap: $(SW_ROOT)/docker/oap/log4j2.xml
+		$(DOCKER_RULE)
+
+docker.ui: $(SW_OUT)/apache-skywalking-apm-bin.tar.gz
+docker.ui: $(SW_ROOT)/docker/ui/Dockerfile.ui
+docker.ui: $(SW_ROOT)/docker/ui/docker-entrypoint.sh
+docker.ui: $(SW_ROOT)/docker/ui/logback.xml
+		$(DOCKER_RULE)
+
+
+# $@ is the name of the target
+# $^ the name of the dependencies for the target
+# Rule Steps #
+##############
+# 1. Make a directory $(DOCKER_BUILD_TOP)/%@
+# 2. This rule uses cp to copy all dependency filenames into into $(DOCKER_BUILD_TOP/$@
+# 3. This rule then changes directories to $(DOCKER_BUID_TOP)/$@
+# 4. This rule runs $(BUILD_PRE) prior to any docker build and only if specified as a dependency variable
+# 5. This rule finally runs docker build passing $(BUILD_ARGS) to docker if they are specified as a dependency variable
+
+DOCKER_RULE=time (mkdir -p $(DOCKER_BUILD_TOP)/$@ && cp -r $^ $(DOCKER_BUILD_TOP)/$@ && cd $(DOCKER_BUILD_TOP)/$@ && $(BUILD_PRE) docker build $(BUILD_ARGS) -t $(HUB)/$(subst docker.,,$@):$(TAG) -f Dockerfile$(suffix $@) .)
+
+# for each docker.XXX target create a push.docker.XXX target that pushes
+# the local docker image to another hub
+# a possible optimization is to use tag.$(TGT) as a dependency to do the tag for us
+$(foreach TGT,$(DOCKER_TARGETS),$(eval push.$(TGT): | $(TGT) ; \
+	time (docker push $(HUB)/$(subst docker.,,$(TGT)):$(TAG))))
+
+# create a DOCKER_PUSH_TARGETS that's each of DOCKER_TARGETS with a push. prefix
+DOCKER_PUSH_TARGETS:=
+$(foreach TGT,$(DOCKER_TARGETS),$(eval DOCKER_PUSH_TARGETS+=push.$(TGT)))
+
+# Will build and push docker images.
+docker.push: $(DOCKER_PUSH_TARGETS)
+
+
diff --git a/docker/Makefile b/docker/Makefile
deleted file mode 100644
index 055a952..0000000
--- a/docker/Makefile
+++ /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.
-
-export DOCKER_ROOT := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
-
-oap: 
-	cd $(DOCKER_ROOT)/oap; \
-	cp ../../dist/apache-skywalking-apm-bin.tar.gz ./ ; \
-	docker build -t skywalking/oap:latest .
-
-ui:
-	cd $(DOCKER_ROOT)/ui; \
-	cp ../../dist/apache-skywalking-apm-bin.tar.gz ./ ; \
-	docker build -t skywalking/ui:latest .
-
-build: oap ui
-
-.PHONY: oap ui
\ No newline at end of file
diff --git a/docker/README.md b/docker/README.md
deleted file mode 100644
index 15d4a2c..0000000
--- a/docker/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-
-# Build all images
-
-```shell
-make build
-```
-
-# Run skywalking by docker-compose
-
-```shell
-docker-compose up
-```
\ No newline at end of file
diff --git a/docker/config/alarm-settings.yml b/docker/config/alarm-settings.yml
deleted file mode 100644
index 829246a..0000000
--- a/docker/config/alarm-settings.yml
+++ /dev/null
@@ -1,72 +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.
-
-# Sample alarm rules.
-rules:
-  # Rule unique name, must be ended with `_rule`.
-  service_resp_time_rule:
-    metrics-name: service_resp_time
-    op: ">"
-    threshold: 1000
-    period: 10
-    count: 3
-    silence-period: 5
-    message: Response time of service {name} is more than 1000ms in last 3 minutes.
-  service_sla_rule:
-    # Metrics value need to be long, double or int
-    metrics-name: service_sla
-    op: "<"
-    threshold: 8000
-    # The length of time to evaluate the metric
-    period: 10
-    # How many times after the metric match the condition, will trigger alarm
-    count: 2
-    # How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.
-    silence-period: 3
-    message: Successful rate of service {name} is lower than 80% in last 2 minutes.
-  service_p90_sla_rule:
-    # Metrics value need to be long, double or int
-    metrics-name: service_p90
-    op: ">"
-    threshold: 1000
-    period: 10
-    count: 3
-    silence-period: 5
-    message: 90% response time of service {name} is more than 1000ms in last 3 minutes
-  service_instance_resp_time_rule:
-    metrics-name: service_instance_resp_time
-    op: ">"
-    threshold: 1000
-    period: 10
-    count: 2
-    silence-period: 5
-    message: Response time of service instance {name} is more than 1000ms in last 2 minutes.
-#  Active endpoint related metric alarm will cost more memory than service and service instance metric alarm.
-#  Because the number of endpoint is much more than service and instance.
-#
-#  endpoint_avg_rule:
-#    metrics-name: endpoint_avg
-#    op: ">"
-#    threshold: 1000
-#    period: 10
-#    count: 2
-#    silence-period: 5
-#    message: Response time of endpoint {name} is more than 1000ms in last 2 minutes.
-
-webhooks:
-#  - http://127.0.0.1/notify/
-#  - http://127.0.0.1/go-wechat/
-
diff --git a/docker/config/application.yml b/docker/config/application.yml
deleted file mode 100644
index afbd3e7..0000000
--- a/docker/config/application.yml
+++ /dev/null
@@ -1,117 +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.
-
-cluster:
-  standalone:
-   # Please check your ZooKeeper is 3.5+, However, it is also compatible with ZooKeeper 3.4.x. Replace the ZooKeeper 3.5+
-   # library the oap-libs folder with your ZooKeeper 3.4.x library.
-#  zookeeper:
-#    nameSpace: ${SW_NAMESPACE:""}
-#    hostPort: ${SW_CLUSTER_ZK_HOST_PORT:localhost:2181}
-#    #Retry Policy
-#    baseSleepTimeMs: ${SW_CLUSTER_ZK_SLEEP_TIME:1000} # initial amount of time to wait between retries
-#    maxRetries: ${SW_CLUSTER_ZK_MAX_RETRIES:3} # max number of times to retry
-#  kubernetes:
-#    watchTimeoutSeconds: ${SW_CLUSTER_K8S_WATCH_TIMEOUT:60}
-#    namespace: ${SW_CLUSTER_K8S_NAMESPACE:default}
-#    labelSelector: ${SW_CLUSTER_K8S_LABEL:app=collector,release=skywalking}
-#    uidEnvName: ${SW_CLUSTER_K8S_UID:SKYWALKING_COLLECTOR_UID}
-#  consul:
-#    serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
-#     Consul cluster nodes, example: 10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500
-#    hostPort: ${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500}
-#  nacos:
-#    serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
-#    hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848}
-core:
-  default:
-    # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
-    # Receiver: Receive agent data, Level 1 aggregate
-    # Aggregator: Level 2 aggregate
-    role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
-    restHost: ${SW_CORE_REST_HOST:0.0.0.0}
-    restPort: ${SW_CORE_REST_PORT:12800}
-    restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}
-    gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
-    gRPCPort: ${SW_CORE_GRPC_PORT:11800}
-    downsampling:
-    - Hour
-    - Day
-    - Month
-    # Set a timeout on metric data. After the timeout has expired, the metric data will automatically be deleted.
-    recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:90} # Unit is minute
-    minuteMetricsDataTTL: ${SW_CORE_MINUTE_METRIC_DATA_TTL:90} # Unit is minute
-    hourMetricsDataTTL: ${SW_CORE_HOUR_METRIC_DATA_TTL:36} # Unit is hour
-    dayMetricsDataTTL: ${SW_CORE_DAY_METRIC_DATA_TTL:45} # Unit is day
-    monthMetricsDataTTL: ${SW_CORE_MONTH_METRIC_DATA_TTL:18} # Unit is month
-storage:
-  elasticsearch:
-    nameSpace: ${SW_NAMESPACE:""}
-    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:elasticsearch:9200}
-    user: ${SW_ES_USER:""}
-    password: ${SW_ES_PASSWORD:""}
-    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
-    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
-    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
-    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # Execute the bulk every 2000 requests
-    bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # flush the bulk every 20mb
-    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
-    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
-    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
-    segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
-#  h2:
-#    driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
-#    url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
-#    user: ${SW_STORAGE_H2_USER:sa}
-#    metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
-#  mysql:
-#    metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
-receiver-sharing-server:
-  default:
-receiver-register:
-  default:
-receiver-trace:
-  default:
-    bufferPath: ${SW_RECEIVER_BUFFER_PATH:../trace-buffer/}  # Path to trace buffer files, suggest to use absolute path
-    bufferOffsetMaxFileSize: ${SW_RECEIVER_BUFFER_OFFSET_MAX_FILE_SIZE:100} # Unit is MB
-    bufferDataMaxFileSize: ${SW_RECEIVER_BUFFER_DATA_MAX_FILE_SIZE:500} # Unit is MB
-    bufferFileCleanWhenRestart: ${SW_RECEIVER_BUFFER_FILE_CLEAN_WHEN_RESTART:false}
-    sampleRate: ${SW_TRACE_SAMPLE_RATE:10000} # The sample rate precision is 1/10000. 10000 means 100% sample in default.
-    slowDBAccessThreshold: ${SW_SLOW_DB_THRESHOLD:default:200,mongodb:100} # The slow database access thresholds. Unit ms.
-receiver-jvm:
-  default:
-service-mesh:
-  default:
-    bufferPath: ${SW_SERVICE_MESH_BUFFER_PATH:../mesh-buffer/}  # Path to trace buffer files, suggest to use absolute path
-    bufferOffsetMaxFileSize: ${SW_SERVICE_MESH_OFFSET_MAX_FILE_SIZE:100} # Unit is MB
-    bufferDataMaxFileSize: ${SW_SERVICE_MESH_BUFFER_DATA_MAX_FILE_SIZE:500} # Unit is MB
-    bufferFileCleanWhenRestart: ${SW_SERVICE_MESH_BUFFER_FILE_CLEAN_WHEN_RESTART:false}
-istio-telemetry:
-  default:
-envoy-metric:
-  default:
-# receiver_zipkin:
-#   default:
-#     host: ${SW_RECEIVER_ZIPKIN_HOST:0.0.0.0}
-#     port: ${SW_RECEIVER_ZIPKIN_PORT:9411}
-#     contextPath: ${SW_RECEIVER_ZIPKIN_CONTEXT_PATH:/}
-query:
-  graphql:
-    path: ${SW_QUERY_GRAPHQL_PATH:/graphql}
-alarm:
-  default:
-telemetry:
-  none:
diff --git a/docker/config/component-libraries.yml b/docker/config/component-libraries.yml
deleted file mode 100644
index 1b71218..0000000
--- a/docker/config/component-libraries.yml
+++ /dev/null
@@ -1,311 +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.
-
-# Define all component libraries' names and IDs, used in monitored application.
-# This is a bothway mapping, agent or SDK could use the value(ID) to represent the component name in uplink data.
-#
-# ######
-#   id
-# ######
-# We highly recommend DO NOT change the IDs in these file, just append new one, and make sure the ID unique.
-# Any replacement will cause visualization and aggregation error.
-#
-# All IDs in this files are reserved, even some IDs removed by some reasons, those IDs will be abandoned.
-#
-# ######
-# languages
-# ######
-# Languages declare which languages are using this component. Multi languages should be separated by `,`
-
-Tomcat:
-  id: 1
-  languages: Java
-HttpClient:
-  id: 2
-  languages: Java,C#,Node.js
-Dubbo:
-  id: 3
-  languages: Java
-H2:
-  id: 4
-  languages: Java
-Mysql:
-  id: 5
-  languages: Java,C#,Node.js
-ORACLE:
-  id: 6
-  languages: Java
-Redis:
-  id: 7
-  languages: Java,C#,Node.js
-Motan:
-  id: 8
-  languages: Java
-MongoDB:
-  id: 9
-  languages: Java,C#,Node.js
-Resin:
-  id: 10
-  languages: Java
-Feign:
-  id: 11
-  languages: Java
-OKHttp:
-  id: 12
-  languages: Java
-SpringRestTemplate:
-  id: 13
-  languages: Java
-SpringMVC:
-  id: 14
-  languages: Java
-Struts2:
-  id: 15
-  languages: Java
-NutzMVC:
-  id: 16
-  languages: Java
-NutzHttp:
-  id: 17
-  languages: Java
-JettyClient:
-  id: 18
-  languages: Java
-JettyServer:
-  id: 19
-  languages: Java
-Memcached:
-  id: 20
-  languages: Java
-ShardingJDBC:
-  id: 21
-  languages: Java
-PostgreSQL:
-  id: 22
-  languages: Java,C#,Node.js
-GRPC:
-  id: 23
-  languages: Java
-ElasticJob:
-  id: 24
-  languages: Java
-RocketMQ:
-  id: 25
-  languages: Java
-httpasyncclient:
-  id: 26
-  languages: Java
-Kafka:
-  id: 27
-  languages: Java
-ServiceComb:
-  id: 28
-  languages: Java
-Hystrix:
-  id: 29
-  languages: Java
-Jedis:
-  id: 30
-  languages: Java
-SQLite:
-  id: 31
-  languages: Java,C#
-h2-jdbc-driver:
-  id: 32
-  languages: Java
-mysql-connector-java:
-  id: 33
-  languages: Java
-ojdbc:
-  id: 34
-  languages: Java
-Spymemcached:
-  id: 35
-  languages: Java
-Xmemcached:
-  id: 36
-  languages: Java
-postgresql-jdbc-driver:
-  id: 37
-  languages: Java
-rocketMQ-producer:
-  id: 38
-  languages: Java
-rocketMQ-consumer:
-  id: 39
-  languages: Java
-kafka-producer:
-  id: 40
-  languages: Java
-kafka-consumer:
-  id: 41
-  languages: Java
-mongodb-driver:
-  id: 42
-  languages: Java
-SOFARPC:
-  id: 43
-  languages: Java
-ActiveMQ:
-  id: 44
-  languages: Java
-activemq-producer:
-  id: 45
-  languages: Java
-activemq-consumer:
-  id: 46
-  languages: Java
-Elasticsearch:
-  id: 47
-  languages: Java
-transport-client:
-  id: 48
-  languages: Java
-http:
-  id: 49
-  languages: Java,C#,Node.js
-rpc:
-  id: 50
-  languages: Java,C#,Node.js
-RabbitMQ:
-  id: 51
-  languages: Java
-rabbitmq-producer:
-  id: 52
-  languages: Java
-rabbitmq-consumer:
-  id: 53
-  languages: Java
-Canal:
-  id: 54
-  languages: Java
-Gson:
-  id: 55
-  languages: Java
-Redisson:
-  id: 56
-  languages: Java
-Lettuce:
-  id: 57
-  languages: Java
-Zookeeper:
-  id: 58
-  languages: Java
-Vertx:
-  id: 59
-  languages: Java
-ShardingSphere:
-  id: 60
-  languages: Java
-
-# .NET/.NET Core components
-# [3000, 4000) for C#/.NET only
-AspNetCore:
-  id: 3001
-  languages: C#
-EntityFrameworkCore:
-  id: 3002
-  languages: C#
-SqlClient:
-  id: 3003
-  languages: C#
-CAP:
-  id: 3004
-  languages: C#
-StackExchange.Redis:
-  id: 3005
-  languages: C#
-SqlServer:
-  id: 3006
-  languages: C#
-Npgsql:
-  id: 3007
-  languages: C#
-MySqlConnector:
-  id: 3008
-  languages: C#
-EntityFrameworkCore.InMemory:
-  id: 3009
-  languages: C#
-EntityFrameworkCore.SqlServer:
-  id: 3010
-  languages: C#
-EntityFrameworkCore.Sqlite:
-  id: 3011
-  languages: C#
-Pomelo.EntityFrameworkCore.MySql:
-  id: 3012
-  languages: C#
-Npgsql.EntityFrameworkCore.PostgreSQL:
-  id: 3013
-  languages: C#
-InMemoryDatabase:
-  id: 3014
-  languages: C#
-AspNet:
-  id: 3015
-  languages: C#
-SmartSql:
-  id: 3016
-  languages: C#
-  
-# NoeJS components
-# [4000, 5000) for Node.js agent
-HttpServer:
-  id: 4001
-  languages: Node.js
-express:
-  id: 4002
-  languages: Node.js
-Egg:
-  id: 4003
-  languages: Node.js
-Koa:
-  id: 4004
-  languages: Node.js
-
-# Component Server mapping defines the server display names of some components
-# e.g.
-# Jedis is a client library in Java for Redis server
-Component-Server-Mappings:
-  mongodb-driver: MongoDB
-  rocketMQ-producer: RocketMQ
-  rocketMQ-consumer: RocketMQ
-  kafka-producer: Kafka
-  kafka-consumer: Kafka
-  activemq-producer: ActiveMQ
-  activemq-consumer: ActiveMQ
-  rabbitmq-producer: RabbitMQ
-  rabbitmq-consumer: RabbitMQ
-  postgresql-jdbc-driver: PostgreSQL
-  Xmemcached: Memcached
-  Spymemcached: Memcached
-  h2-jdbc-driver: H2
-  mysql-connector-java: Mysql
-  Jedis: Redis
-  Redisson: Redis
-  Lettuce: Redis
-  Zookeeper: Zookeeper
-  StackExchange.Redis: Redis
-  SqlClient: SqlServer
-  Npgsql: PostgreSQL
-  MySqlConnector: Mysql
-  EntityFrameworkCore.InMemory: InMemoryDatabase
-  EntityFrameworkCore.SqlServer: SqlServer
-  EntityFrameworkCore.Sqlite: SQLite
-  Pomelo.EntityFrameworkCore.MySql: Mysql
-  Npgsql.EntityFrameworkCore.PostgreSQL: PostgreSQL
-  transport-client: Elasticsearch
diff --git a/docker/config/datasource-settings.properties b/docker/config/datasource-settings.properties
deleted file mode 100644
index 70b0099..0000000
--- a/docker/config/datasource-settings.properties
+++ /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.
-#
-#
-
-jdbcUrl=jdbc:mysql://localhost:3306/swtest
-dataSource.user=root
-dataSource.password=root@1234
-dataSource.cachePrepStmts=true
-dataSource.prepStmtCacheSize=250
-dataSource.prepStmtCacheSqlLimit=2048
-dataSource.useServerPrepStmts=true
-dataSource.useLocalSessionState=true
-dataSource.rewriteBatchedStatements=true
-dataSource.cacheResultSetMetadata=true
-dataSource.cacheServerConfiguration=true
-dataSource.elideSetAutoCommits=true
-dataSource.maintainTimeStats=false
\ No newline at end of file
diff --git a/docker/config/log4j2.xml b/docker/config/log4j2.xml
deleted file mode 100644
index 346d18b..0000000
--- a/docker/config/log4j2.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  ~
-  -->
-
-<Configuration status="INFO">
-    <Appenders>
-        <Console name="Console" target="SYSTEM_OUT">
-            <PatternLayout charset="UTF-8" pattern="%d - %c -%-4r [%t] %-5p %x - %m%n"/>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <logger name="org.eclipse.jetty" level="INFO"/>
-        <logger name="org.apache.zookeeper" level="INFO"/>
-        <logger name="org.elasticsearch.common.network.IfConfig" level="INFO"/>
-        <logger name="io.grpc.netty" level="INFO"/>
-        <logger name="org.apache.skywalking.oap.server.receiver.istio.telemetry" level="DEBUG"/>
-        <logger name="org.apache.skywalking.oap.server.receiver.envoy" level="DEBUG"/>
-        <Root level="INFO">
-            <AppenderRef ref="Console"/>
-        </Root>
-    </Loggers>
-</Configuration>
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 88b40f7..7b5f821 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -17,7 +17,7 @@
 version: '3.3'
 services:
   elasticsearch:
-    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
+    image: docker.elastic.co/elasticsearch/elasticsearch:6.4.3
     container_name: elasticsearch
     restart: always
     ports:
@@ -25,6 +25,10 @@ services:
       - 9300:9300
     environment:
       discovery.type: single-node
+    ulimits:
+      memlock:
+        soft: -1
+        hard: -1
   oap:
     image: skywalking/oap
     container_name: oap
@@ -36,8 +40,9 @@ services:
     ports:
       - 11800:11800
       - 12800:12800
-    volumes:
-      - ./config:/skywalking/config:ro
+    environment:
+      SW_STORAGE: elasticsearch
+      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
   ui:
     image: skywalking/ui
     container_name: ui
@@ -49,4 +54,4 @@ services:
     ports:
       - 8080:8080
     environment:
-      collectorListOfServers: oap:12800
+      SW_OAP_ADDRESS: oap:12800
diff --git a/docker/oap/Dockerfile b/docker/oap/Dockerfile.oap
similarity index 89%
rename from docker/oap/Dockerfile
rename to docker/oap/Dockerfile.oap
index 4b3e9f3..43ec2dd 100644
--- a/docker/oap/Dockerfile
+++ b/docker/oap/Dockerfile.oap
@@ -17,7 +17,9 @@
 FROM openjdk:8u181-jdk-stretch
 
 ENV DIST_NAME=apache-skywalking-apm-bin \
-    JAVA_OPTS=" -Xms256M "
+    JAVA_OPTS=" -Xms256M " \
+    SW_CLUSTER="standalone" \
+    SW_STORAGE="h2"
 
 COPY "$DIST_NAME.tar.gz" /
 
@@ -33,6 +35,6 @@ WORKDIR skywalking
 COPY log4j2.xml config/
 COPY docker-entrypoint.sh .
 
-EXPOSE 12800 11800
+EXPOSE 12800 11800 1234
 
-ENTRYPOINT ["sh", "docker-entrypoint.sh"]
\ No newline at end of file
+ENTRYPOINT ["bash", "docker-entrypoint.sh"]
\ No newline at end of file
diff --git a/docker/oap/docker-entrypoint.sh b/docker/oap/docker-entrypoint.sh
index 593ad1c..764cf01 100755
--- a/docker/oap/docker-entrypoint.sh
+++ b/docker/oap/docker-entrypoint.sh
@@ -16,7 +16,227 @@
 
 #!/bin/bash
 
-set -ex
+set -e
+
+var_application_file="config/application.yml"
+
+generateClusterStandalone() {
+    echo "cluster:" >> ${var_application_file}
+    echo "  standalone:" >> ${var_application_file}
+}
+
+generateClusterZookeeper() {
+    cat <<EOT >> ${var_application_file}
+cluster:
+  zookeeper:
+    nameSpace: \${SW_NAMESPACE:""}
+    hostPort: \${SW_CLUSTER_ZK_HOST_PORT:localhost:2181}
+    #Retry Policy
+    baseSleepTimeMs: \${SW_CLUSTER_ZK_SLEEP_TIME:1000} # initial amount of time to wait between retries
+    maxRetries: \${SW_CLUSTER_ZK_MAX_RETRIES:3} # max number of times to retry
+EOT
+}
+
+generateClusterK8s() {
+    cat <<EOT >> ${var_application_file}
+cluster:
+  kubernetes:
+    watchTimeoutSeconds: \${SW_CLUSTER_K8S_WATCH_TIMEOUT:60}
+    namespace: \${SW_CLUSTER_K8S_NAMESPACE:default}
+    labelSelector: \${SW_CLUSTER_K8S_LABEL:app=collector,release=skywalking}
+    uidEnvName: \${SW_CLUSTER_K8S_UID:SKYWALKING_COLLECTOR_UID}
+EOT
+}
+
+generateClusterConsul() {
+    cat <<EOT >> ${var_application_file}
+cluster:
+  consul:
+    serviceName: \${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
+     Consul cluster nodes, example: 10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500
+    hostPort: \${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500}
+EOT
+}
+
+generateStorageElastisearch() {
+    cat <<EOT >> ${var_application_file}
+storage:
+  elasticsearch:
+    nameSpace: \${SW_NAMESPACE:""}
+    clusterNodes: \${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
+    user: \${SW_ES_USER:""}
+    password: \${SW_ES_PASSWORD:""}
+    indexShardsNumber: \${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
+    indexReplicasNumber: \${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
+    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
+    bulkActions: \${SW_STORAGE_ES_BULK_ACTIONS:2000} # Execute the bulk every 2000 requests
+    bulkSize: \${SW_STORAGE_ES_BULK_SIZE:20} # flush the bulk every 20mb
+    flushInterval: \${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
+    concurrentRequests: \${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
+    metadataQueryMaxSize: \${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
+    segmentQueryMaxSize: \${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
+EOT
+}
+
+generateStorageH2() {
+    cat <<EOT >> ${var_application_file}
+storage:
+  h2:
+    driver: \${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource}
+    url: \${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db}
+    user: \${SW_STORAGE_H2_USER:sa}
+    metadataQueryMaxSize: \${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
+EOT
+}
+
+generateStorageMySQL() {
+    cat <<EOT >> ${var_application_file}
+storage:
+  mysql:
+    metadataQueryMaxSize: \${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
+EOT
+}
+
+validateVariables() {
+    name=$1; value=$2; list=$3
+    valid=false
+    for c in ${list} ; do
+        if [[ "$c" = "$value" ]]; then
+            valid=true
+        fi
+    done
+
+    if ! ${valid}; then
+        echo "Error: $name=$value please specify $name = $list"
+        exit 1
+    fi
+}
+
+generateApplicationYaml() {
+    # validate
+    [[ -z "$SW_CLUSTER" ]] && [[ -z "$SW_STORAGE" ]] && { echo "Error: please specify \"SW_CLUSTER\" \"SW_STORAGE\""; exit 1; }
+
+    validateVariables "SW_CLUSTER" "$SW_CLUSTER" "standalone zookeeper kubernetes consul"
+
+    validateVariables "SW_STORAGE" "$SW_STORAGE" "elasticsearch h2 mysql"
+
+    echo "# Generated by 'docker-entrypoint.sh'" > ${var_application_file}
+    #generate cluster
+    case ${SW_CLUSTER} in
+    standalone) generateClusterStandalone;;
+    zookeeper) generateClusterZookeeper;;
+    kubernetes) generateClusterK8s;;
+    consul) generateClusterConsul;;
+    esac
+
+    #generate core
+    cat <<EOT >> ${var_application_file}
+core:
+  default:
+    # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
+    # Receiver: Receive agent data, Level 1 aggregate
+    # Aggregator: Level 2 aggregate
+    role: \${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
+    restHost: \${SW_CORE_REST_HOST:0.0.0.0}
+    restPort: \${SW_CORE_REST_PORT:12800}
+    restContextPath: \${SW_CORE_REST_CONTEXT_PATH:/}
+    gRPCHost: \${SW_CORE_GRPC_HOST:0.0.0.0}
+    gRPCPort: \${SW_CORE_GRPC_PORT:11800}
+    downsampling:
+    - Hour
+    - Day
+    - Month
+    # Set a timeout on metrics data. After the timeout has expired, the metrics data will automatically be deleted.
+    recordDataTTL: \${SW_CORE_RECORD_DATA_TTL:90} # Unit is minute
+    minuteMetricsDataTTL: \${SW_CORE_MINUTE_METRIC_DATA_TTL:90} # Unit is minute
+    hourMetricsDataTTL: \${SW_CORE_HOUR_METRIC_DATA_TTL:36} # Unit is hour
+    dayMetricsDataTTL: \${SW_CORE_DAY_METRIC_DATA_TTL:45} # Unit is day
+    monthMetricsDataTTL: \${SW_CORE_MONTH_METRIC_DATA_TTL:18} # Unit is month
+EOT
+
+    # generate storage
+    case ${SW_STORAGE} in
+    elasticsearch) generateStorageElastisearch;;
+    h2) generateStorageH2;;
+    mysql) generateStorageMySQL;;
+    esac
+
+    cat <<EOT >> ${var_application_file}
+receiver-sharing-server:
+  default:
+receiver-register:
+  default:
+receiver-trace:
+  default:
+    bufferPath: \${SW_RECEIVER_BUFFER_PATH:../trace-buffer/}  # Path to trace buffer files, suggest to use absolute path
+    bufferOffsetMaxFileSize: \${SW_RECEIVER_BUFFER_OFFSET_MAX_FILE_SIZE:100} # Unit is MB
+    bufferDataMaxFileSize: \${SW_RECEIVER_BUFFER_DATA_MAX_FILE_SIZE:500} # Unit is MB
+    bufferFileCleanWhenRestart: \${SW_RECEIVER_BUFFER_FILE_CLEAN_WHEN_RESTART:false}
+    sampleRate: \${SW_TRACE_SAMPLE_RATE:10000} # The sample rate precision is 1/10000. 10000 means 100% sample in default.
+    slowDBAccessThreshold: \${SW_SLOW_DB_THRESHOLD:default:200,mongodb:100} # The slow database access thresholds. Unit ms.
+receiver-jvm:
+  default:
+receiver-clr:
+  default:
+service-mesh:
+  default:
+    bufferPath: \${SW_SERVICE_MESH_BUFFER_PATH:../mesh-buffer/}  # Path to trace buffer files, suggest to use absolute path
+    bufferOffsetMaxFileSize: \${SW_SERVICE_MESH_OFFSET_MAX_FILE_SIZE:100} # Unit is MB
+    bufferDataMaxFileSize: \${SW_SERVICE_MESH_BUFFER_DATA_MAX_FILE_SIZE:500} # Unit is MB
+    bufferFileCleanWhenRestart: \${SW_SERVICE_MESH_BUFFER_FILE_CLEAN_WHEN_RESTART:false}
+istio-telemetry:
+  default:
+envoy-metric:
+  default:
+query:
+  graphql:
+    path: \${SW_QUERY_GRAPHQL_PATH:/graphql}
+alarm:
+  default:
+telemetry:
+  prometheus:
+    host: \${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0}
+    port: \${SW_TELEMETRY_PROMETHEUS_PORT:1234}
+EOT
+
+    if [[ "$SW_RECEIVER_ZIPKIN_ENABLED" = "true" ]]; then
+        cat <<EOT >> ${var_application_file}
+receiver_zipkin:
+  default:
+    host: \${SW_RECEIVER_ZIPKIN_HOST:0.0.0.0}
+    port: \${SW_RECEIVER_ZIPKIN_PORT:9411}
+    contextPath: \${SW_RECEIVER_ZIPKIN_CONTEXT_PATH:/}
+EOT
+    fi
+
+    if [[ "$SW_RECEIVER_JAEGER_ENABLED" = "true" ]]; then
+        cat <<EOT >> ${var_application_file}
+receiver_jaeger:
+  default:
+    gRPCHost: \${SW_RECEIVER_JAEGER_HOST:0.0.0.0}
+    gRPCPort: \${SW_RECEIVER_JAEGER_PORT:14250}
+EOT
+    fi
+
+    if [[ "$SW_EXPORTER_ENABLED" = "true" ]]; then
+        cat <<EOT >> \${var_application_file}
+exporter:
+  grpc:
+    targetHost: \${SW_EXPORTER_GRPC_HOST:127.0.0.1}
+    targetPort: \${SW_EXPORTER_GRPC_PORT:9870}
+EOT
+    fi
+}
+
+echo "[Entrypoint] Apache SkyWalking Docker Image"
+
+if [[ -z "$SW_L0AD_CONFIG_FILE_FROM_VOLUME" ]] || [[ "$SW_L0AD_CONFIG_FILE_FROM_VOLUME" != "true" ]]; then
+    generateApplicationYaml
+    echo "Generated application.yml"
+    echo "-------------------------"
+    cat ${var_application_file}
+    echo "-------------------------"
+fi
 
 CLASSPATH="config:$CLASSPATH"
 for i in oap-libs/*.jar
@@ -24,5 +244,5 @@ do
     CLASSPATH="$i:$CLASSPATH"
 done
 
-exec java  -XX:+PrintFlagsFinal -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap \
-     ${JAVA_OPTS} -classpath $CLASSPATH org.apache.skywalking.oap.server.starter.OAPServerStartUp "$@"
+exec java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap \
+     ${JAVA_OPTS} -classpath ${CLASSPATH} org.apache.skywalking.oap.server.starter.OAPServerStartUp "$@"
diff --git a/docker/ui/Dockerfile b/docker/ui/Dockerfile.ui
similarity index 90%
rename from docker/ui/Dockerfile
rename to docker/ui/Dockerfile.ui
index 4efaa5a..a52a148 100644
--- a/docker/ui/Dockerfile
+++ b/docker/ui/Dockerfile.ui
@@ -17,7 +17,9 @@
 FROM openjdk:8u181-jdk-stretch
 
 ENV DIST_NAME=apache-skywalking-apm-bin \
-    JAVA_OPTS=" -Xms256M "
+    JAVA_OPTS=" -Xms256M " \
+    SW_OAP_ADDRESS="127.0.0.1:12800" \
+    SW_TIMEOUT="20000"
 
 COPY "$DIST_NAME.tar.gz" /
 
@@ -35,4 +37,4 @@ COPY logback.xml webapp/
 
 EXPOSE 8080
 
-ENTRYPOINT ["sh", "docker-entrypoint.sh"]
\ No newline at end of file
+ENTRYPOINT ["bash", "docker-entrypoint.sh"]
\ No newline at end of file
diff --git a/docker/ui/docker-entrypoint.sh b/docker/ui/docker-entrypoint.sh
index 881368f..6771e22 100755
--- a/docker/ui/docker-entrypoint.sh
+++ b/docker/ui/docker-entrypoint.sh
@@ -16,6 +16,11 @@
 
 #!/bin/bash
 
-set -ex
+set -e
 
-exec java -XX:+PrintFlagsFinal -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -jar webapp/skywalking-webapp.jar --logging.config=webapp/logback.xml --collector.ribbon.listOfServers=${collectorListOfServers} "$@"
+export LOGGING_CONFIG="webapp/logback.xml"
+
+[[ ! -z "$SW_OAP_ADDRESS" ]] && export COLLECTOR_RIBBON_LISTOFSERVERS=${SW_OAP_ADDRESS} && echo "COLLECTOR_RIBBON_LISTOFSERVERS=$COLLECTOR_RIBBON_LISTOFSERVERS"
+[[ ! -z "$SW_TIMEOUT" ]] && export COLLECTOR_RIBBON_READTIMEOUT=${SW_TIMEOUT} && echo "COLLECTOR_RIBBON_READTIMEOUT=$COLLECTOR_RIBBON_READTIMEOUT"
+
+exec java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -jar webapp/skywalking-webapp.jar "$@"
diff --git a/docs/en/guides/How-to-build.md b/docs/en/guides/How-to-build.md
index 8739de1..f403b05 100644
--- a/docs/en/guides/How-to-build.md
+++ b/docs/en/guides/How-to-build.md
@@ -28,12 +28,41 @@ SkyWalking is a complex maven project, including many modules, which could cause
 If you just want to recompile part of the project, you have following options
 - Compile agent and package
 >  ./mvnw package -Pagent,dist
+
+or
+
+> make build.agent
+
 - Compile backend and package
 >  ./mvnw package -Pbackend,dist
+
+or
+
+> make build.backend
+
 - Compile UI and package
 >  ./mvnw package -Pui,dist
 
+or
+
+> make build.ui
+
+
+### Build docker images
+We can build docker images of `backend` and `ui` with `Makefile` located in root folder.
+
+- Build all docker images
+> make docker.all
+
+- Build oap server docker image
+> make docker.oap
+
+- Build ui docker image
+> make docker.ui
 
+`HUB` and `TAG` variables ares used to setup `REPOSITORY` and `TAG` of a docker image. To get
+a oap image with name `bar/oap:foo`, run the following command
+> HUB=bar TAG=foo make docker.oap
 
 ## Setup your IntelliJ IDEA
 1. Import the project as a maven project