add nginx-golang-mysql application sample
Signed-off-by: Anca Iordache <anca.iordache@docker.com>
This commit is contained in:
parent
0bf5504d67
commit
8bb4e23e28
10
samples/nginx-golang-mysql/backend/Dockerfile
Executable file
10
samples/nginx-golang-mysql/backend/Dockerfile
Executable file
@ -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
samples/nginx-golang-mysql/backend/go.mod
Normal file
10
samples/nginx-golang-mysql/backend/go.mod
Normal file
@ -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
samples/nginx-golang-mysql/backend/main.go
Executable file
88
samples/nginx-golang-mysql/backend/main.go
Executable file
@ -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
samples/nginx-golang-mysql/db/password.txt
Normal file
1
samples/nginx-golang-mysql/db/password.txt
Normal file
@ -0,0 +1 @@
|
||||
db-q5n2g
|
29
samples/nginx-golang-mysql/docker-compose.yaml
Normal file
29
samples/nginx-golang-mysql/docker-compose.yaml
Normal file
@ -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
samples/nginx-golang-mysql/proxy/Dockerfile
Executable file
2
samples/nginx-golang-mysql/proxy/Dockerfile
Executable file
@ -0,0 +1,2 @@
|
||||
FROM nginx:1.13-alpine
|
||||
COPY conf /etc/nginx/conf.d/default.conf
|
8
samples/nginx-golang-mysql/proxy/conf
Executable file
8
samples/nginx-golang-mysql/proxy/conf
Executable file
@ -0,0 +1,8 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
location / {
|
||||
proxy_pass http://backend:8000;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user