@@ -7,16 +7,23 @@ import (
77 "github.com/function61/gokit/ezhttp"
88 "github.com/function61/gokit/udocker"
99 "github.com/function61/ubackup/pkg/ubtypes"
10+ "io"
1011 "net/http"
12+ "os/exec"
1113 "strings"
1214)
1315
1416const (
1517 backupCommandEnvKey = "BACKUP_COMMAND"
1618)
1719
20+ type DockerTarget struct {
21+ BackupTarget ubtypes.BackupTarget
22+ Produce func (backupSink io.Writer ) error
23+ }
24+
1825// returns containers that have ENV var "BACKUP_COMMAND" defined
19- func dockerDiscoverBackupTargets (ctx context.Context , dockerEndpoint string ) ([]ubtypes. BackupTarget , error ) {
26+ func dockerDiscoverBackupTargets (ctx context.Context , dockerEndpoint string ) ([]DockerTarget , error ) {
2027 dockerClient , base , err := udocker .Client (dockerEndpoint , nil , false )
2128 if err != nil {
2229 return nil , fmt .Errorf ("udocker.Client: %v" , err )
@@ -41,29 +48,54 @@ func dockerDiscoverBackupTargets(ctx context.Context, dockerEndpoint string) ([]
4148 return nil , err
4249 }
4350
44- targets := []ubtypes. BackupTarget {}
51+ targets := []DockerTarget {}
4552
4653 for _ , inspected := range inspecteds {
54+ foundBackupCommand := ""
55+
4756 for _ , envSerialized := range inspected .Config .Env {
4857 key , value := envvar .Parse (envSerialized )
49- if key ! = backupCommandEnvKey {
50- continue
58+ if key = = backupCommandEnvKey {
59+ foundBackupCommand = value
5160 }
61+ }
5262
53- serviceName := inspected .Config .Labels [udocker .SwarmServiceNameLabelKey ]
54- if serviceName == "" {
55- serviceName = "none"
56- }
63+ if foundBackupCommand == "" {
64+ continue
65+ }
5766
58- // FIXME
59- backupCommandParsed := strings .Split (value , " " )
67+ serviceName := inspected .Config .Labels [udocker .SwarmServiceNameLabelKey ]
68+ if serviceName == "" {
69+ serviceName = "none"
70+ }
71+
72+ // FIXME
73+ backupCommandParsed := strings .Split (foundBackupCommand , " " )
6074
61- targets = append (targets , ubtypes.BackupTarget {
62- ServiceName : serviceName ,
63- TaskId : inspected .Id [0 :12 ], // Docker CLI truncates ids to this long. using same here to shorten filenames
64- BackupCommand : backupCommandParsed ,
65- })
75+ target := ubtypes.BackupTarget {
76+ ServiceName : serviceName ,
77+ TaskId : inspected .Id [0 :12 ], // Docker CLI truncates ids to this long. using same here to shorten filenames
78+ BackupCommand : backupCommandParsed ,
6679 }
80+
81+ producer := func (target ubtypes.BackupTarget ) func (io.Writer ) error {
82+ return func (backupSink io.Writer ) error {
83+ dockerExecCmd := append ([]string {
84+ "docker" ,
85+ "exec" ,
86+ target .TaskId ,
87+ }, target .BackupCommand ... )
88+
89+ return copyCommandStdout (
90+ exec .Command (dockerExecCmd [0 ], dockerExecCmd [1 :]... ),
91+ backupSink )
92+ }
93+ }(target )
94+
95+ targets = append (targets , DockerTarget {
96+ Produce : producer ,
97+ BackupTarget : target ,
98+ })
6799 }
68100
69101 return targets , nil
0 commit comments