/
docker.go
77 lines (66 loc) · 1.64 KB
/
docker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package database
import (
"database/sql"
"net/url"
"time"
"github.com/ory/dockertest"
"github.com/ory/dockertest/docker"
)
// NewTestPostgresDB spawns a new Docker container running
// PostgreSQL v14.5 and executes database migration optionally.
//
// Use "defer resource.Close()" to ensure the container
// is purged when you are done with it.
func NewTestPostgresDB(migrate bool) (*dockertest.Resource, string, error) {
pool, err := dockertest.NewPool("")
if err != nil {
return nil, "", err
}
// Run Postgres v14.5 in a container
user := "postgres"
password := "letmein"
db := "chat-roulette"
resource, err := pool.RunWithOptions(&dockertest.RunOptions{
Repository: "postgres",
Tag: "14.5",
Env: []string{
"POSTGRES_USER=" + user,
"POSTGRES_PASSWORD=" + password,
"POSTGRES_DB=" + db,
"listen_addresses = '*'",
},
}, func(config *docker.HostConfig) {
config.AutoRemove = true
config.RestartPolicy = docker.RestartPolicy{Name: "no"}
})
if err != nil {
return nil, "", err
}
if err := resource.Expire(60); err != nil {
return nil, "", err
}
dbURL := url.URL{
Scheme: "postgres",
User: url.UserPassword(user, password),
Path: db,
Host: resource.GetHostPort("5432/tcp"),
}
databaseURL := appendSSLModeDisable(dbURL.String())
pool.MaxWait = 10 * time.Second
if err = pool.Retry(func() error {
db, err := sql.Open("postgres", databaseURL)
if err != nil {
return err
}
return db.Ping()
}); err != nil {
return nil, "", err
}
// Migrate the database
if migrate {
if err := Migrate(databaseURL); err != nil {
return nil, "", err
}
}
return resource, databaseURL, nil
}