feat: add apisix-dashboard dockerfile & CI (#152)

diff --git a/.github/workflows/dashboard-docker-test.yaml b/.github/workflows/dashboard-docker-test.yaml
new file mode 100644
index 0000000..96f93d0
--- /dev/null
+++ b/.github/workflows/dashboard-docker-test.yaml
@@ -0,0 +1,41 @@
+name: dashboard docker test
+
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
+
+jobs:
+  dashboard-docker-test:
+    name: build dashboard & test
+    runs-on: ubuntu-latest
+    env:
+      APISIX_DASHBOARD_TAG: 2.4
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+
+      - name: Build and run
+        run: |
+          make build-dashboard
+          docker-compose -f ./compose/dashboard-compose.yaml up -d
+          sleep 30
+          docker logs compose_dashboard_1
+
+      - name: check
+        run: |
+          wget https://raw.githubusercontent.com/apache/apisix-dashboard/master/api/test/shell/manager_smoking.sh
+          chmod +x ./manager_smoking.sh
+          sh manager_smoking.sh -s true
+
+      - name: Tar Image
+        run: |
+          make save-dashboard-tar
+
+      - name: Upload Image
+        uses: actions/upload-artifact@v2
+        with:
+          path: ./package
diff --git a/Makefile b/Makefile
index 4671949..1488a5a 100644
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,10 @@
 IMAGE_NAME = apache/apisix
 IMAGE_TAR_NAME = apache_apisix
 
+APISIX_DASHBOARD_VERSION ?= 2.4
+APISIX_DASHBOARD_IMAGE_NAME = apache/apisix-dashboard
+APISIX_DASHBOARD_IMAGE_TAR_NAME = apache_apisix_dashboard
+
 ### build-on-centos:      Build apache/apisix:xx-centos image
 build-on-centos:
 	docker build -t $(IMAGE_NAME):$(APISIX_VERSION)-centos -f ./centos/Dockerfile .
@@ -32,7 +36,7 @@
 # Actually it is not build on certain version but on local code
 # Use this name (in the same patterns with others) for convenient CI
 build-on-alpine-local:
-	docker build -t $(IMAGE_NAME):$(APISIX_VERSION)-alpine-local --build-arg APISIX_PATH=${APISIX_PATH} -f ./alpine-local/Dockerfile .
+	docker build -t $(IMAGE_NAME):$(APISIX_VERSION)-alpine-local --build-arg APISIX_PATH=${APISIX_PATH} -f ./alpine-local/Dockerfile .	
 
 ### save-centos-tar:      tar apache/apisix:xx-centos image
 save-centos-tar:
@@ -44,6 +48,15 @@
 	mkdir -p package
 	docker save -o ./package/$(IMAGE_TAR_NAME)_$(APISIX_VERSION)-alpine.tar $(IMAGE_NAME):$(APISIX_VERSION)-alpine
 
+### build-dashboard:	Build apache/dashboard:tag image
+build-dashboard:
+	docker build -t $(APISIX_DASHBOARD_IMAGE_NAME):$(APISIX_DASHBOARD_VERSION) -f ./dashboard/Dockerfile .
+
+### save-dashboard-tar:      tar apaceh/apisix-dashboard:tag image
+save-dashboard-tar:
+	mkdir -p package
+	docker save -o ./package/$(APISIX_DASHBOARD_IMAGE_TAR_NAME)_$(APISIX_DASHBOARD_VERSION).tar $(APISIX_DASHBOARD_IMAGE_NAME):$(APISIX_DASHBOARD_VERSION)
+
 ### help:             	  Show Makefile rules
 help:
 	@echo Makefile rules:
diff --git a/compose/dashboard-compose.yaml b/compose/dashboard-compose.yaml
new file mode 100644
index 0000000..8e3cf76
--- /dev/null
+++ b/compose/dashboard-compose.yaml
@@ -0,0 +1,35 @@
+version: "3"
+
+services:
+  dashboard:
+    image: "apache/apisix-dashboard:${APISIX_DASHBOARD_TAG}"
+    restart: always
+    volumes:
+      - ../example/dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml:ro
+    depends_on:
+      - etcd
+    ports:
+      - "9000:9000/tcp"
+    networks:
+      - apisix
+
+  etcd:
+    image: bitnami/etcd:3.4.9
+    user: root
+    restart: always
+    volumes:
+      - ../example/etcd_data:/etcd_data
+    environment:
+      ETCD_DATA_DIR: /etcd_data
+      ETCD_ENABLE_V2: "true"
+      ALLOW_NONE_AUTHENTICATION: "yes"
+      ETCD_ADVERTISE_CLIENT_URLS: "http://0.0.0.0:2379"
+      ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
+    ports:
+      - "2379:2379/tcp"
+    networks:
+      - apisix
+
+networks:
+  apisix:
+    driver: bridge
diff --git a/dashboard/Dockerfile b/dashboard/Dockerfile
new file mode 100644
index 0000000..296678e
--- /dev/null
+++ b/dashboard/Dockerfile
@@ -0,0 +1,69 @@
+#
+# 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 alpine:latest as pre-build
+
+ARG APISIX_DASHBOARD_VERSION=v2.4
+
+RUN set -x \
+    && apk add --no-cache --virtual .builddeps git \
+    && git clone https://github.com/apache/apisix-dashboard.git -b ${APISIX_DASHBOARD_VERSION} /usr/local/apisix-dashboard \
+    && cd /usr/local/apisix-dashboard && git clean -Xdf \
+    && rm -f ./.githash && git log --pretty=format:"%h" -1 > ./.githash
+
+FROM golang:1.14 as api-builder
+
+ARG ENABLE_PROXY=false
+
+WORKDIR /usr/local/apisix-dashboard
+
+COPY --from=pre-build /usr/local/apisix-dashboard .
+
+RUN if [ "$ENABLE_PROXY" = "true" ] ; then go env -w GOPROXY=https://goproxy.io,direct ; fi \
+    && go env -w GO111MODULE=on \
+    && CGO_ENABLED=0 ./api/build.sh
+
+FROM node:14-alpine as fe-builder
+
+ARG ENABLE_PROXY=false
+
+WORKDIR /usr/local/apisix-dashboard
+
+COPY --from=pre-build /usr/local/apisix-dashboard .
+
+WORKDIR /usr/local/apisix-dashboard/web
+
+RUN if [ "$ENABLE_PROXY" = "true" ] ; then yarn config set registry https://registry.npm.taobao.org/ ; fi \
+    && yarn install \
+    && yarn build
+
+FROM alpine:latest as prod
+
+ARG ENABLE_PROXY=false
+
+RUN if [ "$ENABLE_PROXY" = "true" ] ; then sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories ; fi
+
+WORKDIR /usr/local/apisix-dashboard
+
+COPY --from=api-builder /usr/local/apisix-dashboard/output/ ./
+
+COPY --from=fe-builder /usr/local/apisix-dashboard/output/ ./
+
+RUN mkdir logs
+
+EXPOSE 9000
+
+CMD [ "/usr/local/apisix-dashboard/manager-api" ]
diff --git a/dashboard/README.md b/dashboard/README.md
new file mode 100644
index 0000000..ff0b81f
--- /dev/null
+++ b/dashboard/README.md
@@ -0,0 +1,7 @@
+### build command
+
+```shell
+$ docker build --build-arg APISIX_DASHBOARD_VERSION=$APISIX_DASHBOARD_VERSION -t $IMAGE_NAME .
+```
+
+Note: The minimum version of docker that supports building image is `docker 17.05.0-ce`.