mirror of
https://github.com/raseels-repos/golang-saas-starter-kit.git
synced 2025-06-06 23:46:29 +02:00
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package docker
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
"os/exec"
|
|
)
|
|
|
|
// Container contains the information about the container.
|
|
type Container struct {
|
|
ID string
|
|
Port string
|
|
User string
|
|
Pass string
|
|
Database string
|
|
}
|
|
|
|
// StartPostgres runs a postgres container to execute commands.
|
|
func StartPostgres(log *log.Logger) (*Container, error) {
|
|
user := "postgres"
|
|
pass := "postgres"
|
|
|
|
cmd := exec.Command("docker", "run", "--env", "POSTGRES_USER="+user, "--env", "POSTGRES_PASSWORD="+pass, "-P", "-d", "postgres:11-alpine")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
if err := cmd.Run(); err != nil {
|
|
return nil, fmt.Errorf("starting container: %v", err)
|
|
}
|
|
|
|
id := out.String()[:12]
|
|
log.Println("DB ContainerID:", id)
|
|
|
|
cmd = exec.Command("docker", "inspect", id)
|
|
out.Reset()
|
|
cmd.Stdout = &out
|
|
if err := cmd.Run(); err != nil {
|
|
return nil, fmt.Errorf("inspect container: %v", err)
|
|
}
|
|
|
|
var doc []struct {
|
|
NetworkSettings struct {
|
|
Ports struct {
|
|
TCP5432 []struct {
|
|
HostPort string `json:"HostPort"`
|
|
} `json:"5432/tcp"`
|
|
} `json:"Ports"`
|
|
} `json:"NetworkSettings"`
|
|
}
|
|
if err := json.Unmarshal(out.Bytes(), &doc); err != nil {
|
|
return nil, fmt.Errorf("decoding json: %v", err)
|
|
}
|
|
|
|
c := Container{
|
|
ID: id,
|
|
Port: doc[0].NetworkSettings.Ports.TCP5432[0].HostPort,
|
|
User: user,
|
|
Pass: pass,
|
|
Database: "postgres",
|
|
}
|
|
|
|
log.Println("DB Port:", c.Port)
|
|
|
|
return &c, nil
|
|
}
|
|
|
|
// StopPostgres stops and removes the specified container.
|
|
func StopPostgres(log *log.Logger, c *Container) error {
|
|
if err := exec.Command("docker", "stop", c.ID).Run(); err != nil {
|
|
return err
|
|
}
|
|
log.Println("Stopped:", c.ID)
|
|
|
|
if err := exec.Command("docker", "rm", c.ID, "-v").Run(); err != nil {
|
|
return err
|
|
}
|
|
log.Println("Removed:", c.ID)
|
|
|
|
return nil
|
|
}
|