DockerImageBuilder.java 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package com.moekr.moocoder.logic.service.impl;
  2. import com.moekr.moocoder.data.dao.ProblemDAO;
  3. import com.moekr.moocoder.data.entity.Problem;
  4. import com.moekr.moocoder.logic.api.DockerApi;
  5. import com.moekr.moocoder.logic.storage.StorageProvider;
  6. import lombok.extern.apachecommons.CommonsLog;
  7. import org.apache.commons.io.FileUtils;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Component;
  10. import org.springframework.transaction.annotation.Transactional;
  11. import org.zeroturnaround.zip.ZipUtil;
  12. import java.io.*;
  13. import java.nio.file.Files;
  14. import java.time.LocalDateTime;
  15. @Component
  16. @CommonsLog
  17. public class DockerImageBuilder {
  18. private static final String TEMP_PREFIX = "MOOCODER-DOCKER-";
  19. private final ProblemDAO problemDAO;
  20. private final DockerApi dockerApi;
  21. private final StorageProvider storageProvider;
  22. @Autowired
  23. public DockerImageBuilder(ProblemDAO problemDAO, DockerApi dockerApi, StorageProvider storageProvider) {
  24. this.problemDAO = problemDAO;
  25. this.dockerApi = dockerApi;
  26. this.storageProvider = storageProvider;
  27. }
  28. @Transactional(rollbackFor = Exception.class)
  29. public void buildDockerImage(int problemId) throws Exception {
  30. Problem problem = problemDAO.findById(problemId);
  31. problem.setModifiedAt(LocalDateTime.now());
  32. File tempDir = Files.createTempDirectory(TEMP_PREFIX).toFile();
  33. try {
  34. buildDockerImage(tempDir, problem);
  35. problemDAO.save(problem);
  36. } finally {
  37. FileUtils.deleteDirectory(tempDir);
  38. }
  39. }
  40. private void buildDockerImage(File tempDir, Problem problem) throws Exception {
  41. File problemDir = new File(new File(tempDir, "code"), problem.getUniqueName());
  42. if (!problemDir.mkdirs()) {
  43. throw new IOException("创建临时文件夹失败!");
  44. }
  45. byte[] content = storageProvider.fetch(problem.getUniqueName() + ".zip");
  46. ByteArrayInputStream inputStream = new ByteArrayInputStream(content);
  47. ZipUtil.unpack(inputStream, problemDir);
  48. File dockerFile = new File(tempDir, "Dockerfile");
  49. try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dockerFile)))) {
  50. writer.write(problem.getType().getHelper().dockerFile(problem.getUniqueName()));
  51. }
  52. dockerApi.build(tempDir.getAbsolutePath(), problem.getImageName(), problem.getImageTag());
  53. }
  54. }