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