Browse Source

add nginx-golang-mysql application sample

Signed-off-by: Anca Iordache <anca.iordache@docker.com>
Anca Iordache 6 years ago
parent
commit
8bb4e23e28

+ 10 - 0
samples/nginx-golang-mysql/backend/Dockerfile

@@ -0,0 +1,10 @@
+FROM golang:1.13-alpine AS build
+WORKDIR /go/src/github.com/org/repo
+COPY . .
+
+RUN go build -o server .
+
+FROM alpine:3.7
+EXPOSE 8000
+COPY --from=build /go/src/github.com/org/repo/server /server
+CMD ["/server"]

+ 10 - 0
samples/nginx-golang-mysql/backend/go.mod

@@ -0,0 +1,10 @@
+module github.com/org/repo
+
+go 1.13
+
+require (
+	github.com/go-sql-driver/mysql v1.3.0
+	github.com/gorilla/context v1.1.1
+	github.com/gorilla/handlers v1.3.0
+	github.com/gorilla/mux v1.6.2
+)

+ 88 - 0
samples/nginx-golang-mysql/backend/main.go

@@ -0,0 +1,88 @@
+package main
+
+import (
+	"database/sql"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"os"
+	"time"
+
+	_ "github.com/go-sql-driver/mysql"
+	"github.com/gorilla/handlers"
+	"github.com/gorilla/mux"
+)
+
+func connect() (*sql.DB, error) {
+	bin, err := ioutil.ReadFile("/run/secrets/db-password")
+	if err != nil {
+		return nil, err
+	}
+	return sql.Open("mysql", fmt.Sprintf("root:%s@tcp(db:3306)/example", string(bin)))
+}
+
+func blogHandler(w http.ResponseWriter, r *http.Request) {
+	db, err := connect()
+	if err != nil {
+		w.WriteHeader(500)
+		return
+	}
+	defer db.Close()
+
+	rows, err := db.Query("SELECT title FROM blog")
+	if err != nil {
+		w.WriteHeader(500)
+		return
+	}
+	var titles []string
+	for rows.Next() {
+		var title string
+		err = rows.Scan(&title)
+		titles = append(titles, title)
+	}
+	json.NewEncoder(w).Encode(titles)
+}
+
+func main() {
+	log.Print("Prepare db...")
+	if err := prepare(); err != nil {
+		log.Fatal(err)
+	}
+
+	log.Print("Listening 8000")
+	r := mux.NewRouter()
+	r.HandleFunc("/", blogHandler)
+	log.Fatal(http.ListenAndServe(":8000", handlers.LoggingHandler(os.Stdout, r)))
+}
+
+func prepare() error {
+	db, err := connect()
+	if err != nil {
+		return err
+	}
+	defer db.Close()
+
+	for i := 0; i < 60; i++ {
+		if err := db.Ping(); err == nil {
+			break
+		}
+		time.Sleep(time.Second)
+	}
+
+	if _, err := db.Exec("DROP TABLE IF EXISTS blog"); err != nil {
+		return err
+	}
+
+	if _, err := db.Exec("CREATE TABLE IF NOT EXISTS blog (id int NOT NULL AUTO_INCREMENT, title varchar(255), PRIMARY KEY (id))"); err != nil {
+		return err
+	}
+
+	for i := 0; i < 5; i++ {
+		if _, err := db.Exec("INSERT INTO blog (title) VALUES (?);", fmt.Sprintf("Blog post #%d", i)); err != nil {
+			return err
+		}
+	}
+	return nil
+}

+ 1 - 0
samples/nginx-golang-mysql/db/password.txt

@@ -0,0 +1 @@
+db-q5n2g

+ 29 - 0
samples/nginx-golang-mysql/docker-compose.yaml

@@ -0,0 +1,29 @@
+version: "3.7"
+services:
+  backend:
+    build: backend
+    secrets:
+    - db-password
+    depends_on: 
+    - db
+  db:
+    environment:
+      MYSQL_DATABASE: example
+      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db-password
+    image: mysql:5.7
+    restart: always
+    secrets:
+    - db-password
+    volumes:
+    - db-data:/var/lib/mysql
+  proxy:
+    build: proxy
+    ports:
+    - 80:80
+    depends_on: 
+    - backend
+volumes:
+  db-data: {}
+secrets:
+  db-password:
+    file: db/password.txt

+ 2 - 0
samples/nginx-golang-mysql/proxy/Dockerfile

@@ -0,0 +1,2 @@
+FROM nginx:1.13-alpine
+COPY conf /etc/nginx/conf.d/default.conf

+ 8 - 0
samples/nginx-golang-mysql/proxy/conf

@@ -0,0 +1,8 @@
+server {
+    listen       80;
+    server_name  localhost;
+    location / {
+        proxy_pass   http://backend:8000;
+    }
+
+}