镜像自地址
https://github.com/tuna/tunasync.git
已同步 2025-12-06 22:46:47 +00:00
feat(worker): Implemented docker executor, close #55
if docker is enabled in configure file and `docker_image` is set on mirror config, the command would be executed via `docker run ...`
这个提交包含在:
98
worker/docker.go
普通文件
98
worker/docker.go
普通文件
@@ -0,0 +1,98 @@
|
||||
package worker
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
type dockerHook struct {
|
||||
emptyHook
|
||||
provider mirrorProvider
|
||||
image string
|
||||
volumes []string
|
||||
options []string
|
||||
}
|
||||
|
||||
func newDockerHook(p mirrorProvider, gCfg dockerConfig, mCfg mirrorConfig) *dockerHook {
|
||||
volumes := []string{}
|
||||
volumes = append(volumes, gCfg.Volumes...)
|
||||
volumes = append(volumes, mCfg.DockerVolumes...)
|
||||
|
||||
options := []string{}
|
||||
options = append(options, gCfg.Options...)
|
||||
options = append(options, mCfg.DockerOptions...)
|
||||
|
||||
return &dockerHook{
|
||||
provider: p,
|
||||
image: mCfg.DockerImage,
|
||||
volumes: volumes,
|
||||
options: options,
|
||||
}
|
||||
}
|
||||
|
||||
func (d *dockerHook) preExec() error {
|
||||
p := d.provider
|
||||
logFile := p.LogFile()
|
||||
workingDir := p.WorkingDir()
|
||||
|
||||
if _, err := os.Stat(workingDir); os.IsNotExist(err) {
|
||||
logger.Debugf("Making dir %s", workingDir)
|
||||
if err = os.MkdirAll(workingDir, 0755); err != nil {
|
||||
return fmt.Errorf("Error making dir %s: %s", workingDir, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
logFileNew := "/log_latest"
|
||||
workingDirNew := "/data"
|
||||
|
||||
// Override workingDir
|
||||
ctx := p.EnterContext()
|
||||
ctx.Set(_WorkingDirKey, workingDirNew)
|
||||
ctx.Set(_LogFileKey+":docker", logFileNew)
|
||||
ctx.Set(
|
||||
"volumes", []string{
|
||||
fmt.Sprintf("%s:%s", logFile, logFileNew),
|
||||
fmt.Sprintf("%s:%s", workingDir, workingDirNew),
|
||||
},
|
||||
)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *dockerHook) postExec() error {
|
||||
// sh.Command(
|
||||
// "docker", "rm", "-f", d.Name(),
|
||||
// ).Run()
|
||||
d.provider.ExitContext()
|
||||
return nil
|
||||
}
|
||||
|
||||
// Volumes returns the configured volumes and
|
||||
// runtime-needed volumes, including mirror dirs
|
||||
// and log files
|
||||
func (d *dockerHook) Volumes() []string {
|
||||
vols := make([]string, len(d.volumes))
|
||||
copy(vols, d.volumes)
|
||||
|
||||
p := d.provider
|
||||
ctx := p.Context()
|
||||
if ivs, ok := ctx.Get("volumes"); ok {
|
||||
vs := ivs.([]string)
|
||||
vols = append(vols, vs...)
|
||||
}
|
||||
return vols
|
||||
}
|
||||
|
||||
func (d *dockerHook) LogFile() string {
|
||||
p := d.provider
|
||||
ctx := p.Context()
|
||||
if iv, ok := ctx.Get(_LogFileKey + ":docker"); ok {
|
||||
v := iv.(string)
|
||||
return v
|
||||
}
|
||||
return p.LogFile()
|
||||
}
|
||||
|
||||
func (d *dockerHook) Name() string {
|
||||
p := d.provider
|
||||
return "tunasync-job-" + p.Name()
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户