(req dto.ImageBuild)
| 202 | } |
| 203 | |
| 204 | func (u *ImageService) ImageBuild(req dto.ImageBuild) error { |
| 205 | client, err := docker.NewDockerClient() |
| 206 | if err != nil { |
| 207 | return err |
| 208 | } |
| 209 | defer client.Close() |
| 210 | fileName := "Dockerfile" |
| 211 | if req.From == "edit" { |
| 212 | dir := fmt.Sprintf("%s/docker/build/%s", global.Dir.DataDir, strings.ReplaceAll(req.Name, ":", "_")) |
| 213 | if _, err := os.Stat(dir); err != nil && os.IsNotExist(err) { |
| 214 | if err = os.MkdirAll(dir, os.ModePerm); err != nil { |
| 215 | return err |
| 216 | } |
| 217 | } |
| 218 | |
| 219 | pathItem := fmt.Sprintf("%s/Dockerfile", dir) |
| 220 | file, err := os.OpenFile(pathItem, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, constant.FilePerm) |
| 221 | if err != nil { |
| 222 | return err |
| 223 | } |
| 224 | defer file.Close() |
| 225 | write := bufio.NewWriter(file) |
| 226 | _, _ = write.WriteString(string(req.Dockerfile)) |
| 227 | write.Flush() |
| 228 | req.Dockerfile = dir |
| 229 | } else { |
| 230 | fileName = path.Base(req.Dockerfile) |
| 231 | req.Dockerfile = path.Dir(req.Dockerfile) |
| 232 | } |
| 233 | tar, err := archive.TarWithOptions(req.Dockerfile+"/", &archive.TarOptions{}) |
| 234 | if err != nil { |
| 235 | return err |
| 236 | } |
| 237 | |
| 238 | opts := build.ImageBuildOptions{ |
| 239 | Dockerfile: fileName, |
| 240 | Tags: []string{req.Name}, |
| 241 | Remove: true, |
| 242 | Labels: stringsToMap(req.Tags), |
| 243 | BuildArgs: stringsToMap2(req.Args), |
| 244 | } |
| 245 | taskItem, err := task.NewTaskWithOps(req.Name, task.TaskBuild, task.TaskScopeImage, req.TaskID, 1) |
| 246 | if err != nil { |
| 247 | return fmt.Errorf("new task for image build failed, err: %v", err) |
| 248 | } |
| 249 | |
| 250 | go func() { |
| 251 | defer tar.Close() |
| 252 | taskItem.AddSubTask(i18n.GetMsgByKey("ImageBuild"), func(t *task.Task) error { |
| 253 | dockerCli := docker.NewClientWithExist(client) |
| 254 | if err := dockerCli.BuildImageWithProcessAndOptions(taskItem, tar, opts); err != nil { |
| 255 | return err |
| 256 | } |
| 257 | return nil |
| 258 | }, nil) |
| 259 | |
| 260 | _ = taskItem.Execute() |
| 261 | }() |
nothing calls this directly
no test coverage detected