Selaa lähdekoodia

Add support for in-app restart (wait for the DB to go up)

Andrea Fazzi 6 vuotta sitten
vanhempi
commit
4518221660
5 muutettua tiedostoa jossa 30 lisäystä ja 24 poistoa
  1. 2 2
      Dockerfile
  2. 0 0
      compose/karmen/db.env
  3. 1 1
      compose/karmen/docker-compose.yml
  4. 27 5
      main.go
  5. 0 16
      start.sh

+ 2 - 2
Dockerfile

@@ -5,8 +5,8 @@ RUN mkdir -p $GOPATH/src/gogs.carducci-dante.gov.it/karmen
 ADD . $GOPATH/src/gogs.carducci-dante.gov.it/karmen/core
 COPY config/config.yaml /go/src/gogs.carducci-dante.gov.it/karmen/core/config/
 WORKDIR $GOPATH/src/gogs.carducci-dante.gov.it/karmen/core
-RUN go build -o main .
-ENTRYPOINT ["/go/src/gogs.carducci-dante.gov.it/karmen/core/start.sh"]
+RUN go build -o server *.go
+ENTRYPOINT ["/go/src/gogs.carducci-dante.gov.it/karmen/core/server"]
 VOLUME /go/src/gogs.carducci-dante.gov.it/karmen/core/config
 VOLUME /go/src/gogs.carducci-dante.gov.it/karmen/core/documents
 EXPOSE 3000

+ 0 - 0
karmen_compose/db.env → compose/karmen/db.env


+ 1 - 1
karmen_compose/docker-compose.yml → compose/karmen/docker-compose.yml

@@ -3,7 +3,7 @@ version: "3.3"
 services:
 
   app:
-    build: ../
+    build: ../../
     ports:
       - 3000:3000
     environment:

+ 27 - 5
main.go

@@ -5,6 +5,7 @@ import (
 	"log"
 	"net/http"
 	"os"
+	"time"
 
 	"github.com/gorilla/handlers"
 	"github.com/jinzhu/gorm"
@@ -15,6 +16,11 @@ import (
 	"gogs.carducci-dante.gov.it/karmen/orm"
 )
 
+const (
+	MaxNumRetries     = 20
+	RetryTimeInterval = 2
+)
+
 func regenerateRelations(db *gorm.DB) error {
 	var activities []orm.Activity
 
@@ -39,17 +45,33 @@ func regenerateRelations(db *gorm.DB) error {
 }
 
 func main() {
+
+	var (
+		db  *gorm.DB
+		err error
+	)
+
 	log.Println("Loading config file...")
-	err := config.ReadFile("config/config.yaml", config.Config)
+	err = config.ReadFile("config/config.yaml", config.Config)
 	if err != nil {
 		panic(err)
 	}
 
-	log.Println("Starting karmen...")
+	log.Println("Starting karmen and waiting for the DB...")
 
-	db, err := orm.New(fmt.Sprintf("%s?%s", config.Config.Orm.Connection, config.Config.Orm.Options))
-	if err != nil {
-		panic(err)
+	count := MaxNumRetries
+	wait := true
+
+	for wait && count > 0 {
+		db, err = orm.New(fmt.Sprintf("%s?%s", config.Config.Orm.Connection, config.Config.Orm.Options))
+		if err != nil {
+			count--
+			log.Println(err)
+			log.Printf("Remaining retries: %d", count)
+			time.Sleep(time.Second * RetryTimeInterval)
+			continue
+		}
+		wait = false
 	}
 
 	orm.Use(db)

+ 0 - 16
start.sh

@@ -1,16 +0,0 @@
-#!/bin/sh
-
-echo "Connecting to ${DB_HOST}:${DB_PORT}"
-
-while true; do
-    nc -z ${DB_HOST} ${DB_PORT} && break
-    echo "Unable to connect to ${DB_HOST}:${DB_PORT}; sleeping"
-    sleep 1
-done
-
-echo "Waiting for database to settle"
-sleep 3
-
-go run main.go
-
-