10 "github.com/docker/docker/client"
13 const composeTemplate = `# generated by integration-cli-on-swarm
18 image: "{{.WorkerImage}}"
19 command: ["-worker-image-digest={{.WorkerImageDigest}}", "-dry-run={{.DryRun}}", "-keep-executor={{.KeepExecutor}}"]
23 # Bind-mount the API socket so that we can invoke "docker run --privileged" within the service containers
24 - /var/run/docker.sock:/var/run/docker.sock
26 - DOCKER_GRAPHDRIVER={{.EnvDockerGraphDriver}}
27 - DOCKER_EXPERIMENTAL={{.EnvDockerExperimental}}
30 replicas: {{.Replicas}}
32 # The restart condition needs to be any for funker function
36 image: "{{.MasterImage}}"
37 command: ["-worker-service=worker", "-input=/mnt/input", "-chunks={{.Chunks}}", "-shuffle={{.Shuffle}}", "-rand-seed={{.RandSeed}}"]
48 # Make sure the master can access the volume
49 constraints: [node.id == {{.SelfNodeID}}]
59 type composeOptions struct {
71 type composeTemplateOptions struct {
73 WorkerImageDigest string
75 EnvDockerGraphDriver string
76 EnvDockerExperimental string
79 // createCompose creates "dir/docker-compose.yml".
80 // If dir is empty, TempDir() is used.
81 func createCompose(dir string, cli *client.Client, opts composeOptions) (string, error) {
84 dir, err = ioutil.TempDir("", "integration-cli-on-swarm-")
89 resolved := composeTemplateOptions{}
90 resolved.composeOptions = opts
91 workerImageInspect, _, err := cli.ImageInspectWithRaw(context.Background(), defaultWorkerImageName)
95 if len(workerImageInspect.RepoDigests) > 0 {
96 resolved.WorkerImageDigest = workerImageInspect.RepoDigests[0]
98 // fall back for non-pushed image
99 resolved.WorkerImageDigest = workerImageInspect.ID
101 info, err := cli.Info(context.Background())
105 resolved.SelfNodeID = info.Swarm.NodeID
106 resolved.EnvDockerGraphDriver = os.Getenv("DOCKER_GRAPHDRIVER")
107 resolved.EnvDockerExperimental = os.Getenv("DOCKER_EXPERIMENTAL")
108 composeFilePath := filepath.Join(dir, "docker-compose.yml")
109 tmpl, err := template.New("").Parse(composeTemplate)
113 f, err := os.Create(composeFilePath)
118 if err = tmpl.Execute(f, resolved); err != nil {
121 return composeFilePath, nil