/
changeState.go
129 lines (105 loc) · 2.81 KB
/
changeState.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package dockerdb
import (
"context"
"errors"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
)
// Run launches the docker container.
// Can return ErrWarning that must be not necessary to handle
func (ddb *VDB) Run(ctx context.Context) (err error) {
defer func() {
if r := recover(); r != nil {
err = ErrUnknown
}
}()
if err = ddb.cli.ContainerStart(ctx, ddb.id, types.ContainerStartOptions{}); err != nil {
return err
}
if ddb.conf.resources != nil {
ok, err := ddb.cli.ContainerUpdate(ctx, ddb.id, container.UpdateConfig{
Resources: *ddb.conf.resources,
RestartPolicy: container.RestartPolicy{},
})
if err != nil {
return fmt.Errorf("container update error: %w", err)
}
if len(ok.Warnings) != 0 {
warnErrors := make([]error, len(ok.Warnings)+1)
warnErrors[0] = ErrWarning
for i, w := range ok.Warnings {
warnErrors[i+1] = fmt.Errorf("warning: %s", w)
}
return errors.Join(warnErrors...)
}
}
return nil
}
// Run launches a docker container by ID.
// DEPRECATED: USE vdb.Run() instead.
func Run(ctx context.Context, ID string) error {
cli, err := client.NewClientWithOpts(client.FromEnv,
client.WithAPIVersionNegotiation())
if err != nil {
return err
}
ddb := &VDB{
id: ID,
cli: cli,
}
return ddb.Run(ctx)
}
// Pause suspends the docker container.
func (ddb *VDB) Pause(ctx context.Context) (err error) {
if err = ddb.cli.ContainerPause(ctx, ddb.id); err != nil {
return err
}
return nil
}
// Unpause resumes the docker container.
func (ddb *VDB) Unpause(ctx context.Context) (err error) {
if err = ddb.cli.ContainerUnpause(ctx, ddb.id); err != nil {
return err
}
return nil
}
// Kill kills the docker container.
func (ddb *VDB) Kill(ctx context.Context, signal string) (err error) {
if err = ddb.cli.ContainerKill(ctx, ddb.id, signal); err != nil {
return err
}
return nil
}
// Stop stops the docker container.
func (ddb *VDB) Stop(ctx context.Context) (err error) {
if err = ddb.cli.ContainerStop(ctx, ddb.id, container.StopOptions{}); err != nil {
return err
}
return nil
}
// Restart stops and starts a container again.
func (ddb *VDB) Restart(ctx context.Context) (err error) {
if err = ddb.cli.ContainerRestart(ctx, ddb.id, container.StopOptions{}); err != nil {
return err
}
return nil
}
// Remove removes a container.
func (ddb *VDB) Remove(ctx context.Context) (err error) {
if err = ddb.cli.ContainerRemove(ctx, ddb.id, types.ContainerRemoveOptions{}); err != nil {
return err
}
return nil
}
// Clear kills and removes a container.
func (ddb *VDB) Clear(ctx context.Context) (err error) {
if err = ddb.cli.ContainerRemove(ctx, ddb.id, types.ContainerRemoveOptions{
Force: true,
RemoveVolumes: true,
}); err != nil {
return err
}
return nil
}