Signed-off-by: Anca Iordache <anca.iordache@docker.com>pull/2/head
parent
0bf5504d67
commit
8bb4e23e28
@ -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"] |
@ -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 |
||||||
|
) |
@ -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 |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
db-q5n2g |
@ -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 |
@ -0,0 +1,2 @@ |
|||||||
|
FROM nginx:1.13-alpine |
||||||
|
COPY conf /etc/nginx/conf.d/default.conf |
@ -0,0 +1,8 @@ |
|||||||
|
server { |
||||||
|
listen 80; |
||||||
|
server_name localhost; |
||||||
|
location / { |
||||||
|
proxy_pass http://backend:8000; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue