diff --git a/samples/nginx-golang-mysql/backend/Dockerfile b/samples/nginx-golang-mysql/backend/Dockerfile new file mode 100755 index 0000000..0c7d0af --- /dev/null +++ b/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"] diff --git a/samples/nginx-golang-mysql/backend/go.mod b/samples/nginx-golang-mysql/backend/go.mod new file mode 100644 index 0000000..01f8e83 --- /dev/null +++ b/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 +) diff --git a/samples/nginx-golang-mysql/backend/main.go b/samples/nginx-golang-mysql/backend/main.go new file mode 100755 index 0000000..af03909 --- /dev/null +++ b/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 +} diff --git a/samples/nginx-golang-mysql/db/password.txt b/samples/nginx-golang-mysql/db/password.txt new file mode 100644 index 0000000..cea6d05 --- /dev/null +++ b/samples/nginx-golang-mysql/db/password.txt @@ -0,0 +1 @@ +db-q5n2g \ No newline at end of file diff --git a/samples/nginx-golang-mysql/docker-compose.yaml b/samples/nginx-golang-mysql/docker-compose.yaml new file mode 100644 index 0000000..b2aaadf --- /dev/null +++ b/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 diff --git a/samples/nginx-golang-mysql/proxy/Dockerfile b/samples/nginx-golang-mysql/proxy/Dockerfile new file mode 100755 index 0000000..f5760d0 --- /dev/null +++ b/samples/nginx-golang-mysql/proxy/Dockerfile @@ -0,0 +1,2 @@ +FROM nginx:1.13-alpine +COPY conf /etc/nginx/conf.d/default.conf \ No newline at end of file diff --git a/samples/nginx-golang-mysql/proxy/conf b/samples/nginx-golang-mysql/proxy/conf new file mode 100755 index 0000000..f6d2195 --- /dev/null +++ b/samples/nginx-golang-mysql/proxy/conf @@ -0,0 +1,8 @@ +server { + listen 80; + server_name localhost; + location / { + proxy_pass http://backend:8000; + } + +}