DockerApiImpl.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package seecoder.devcloud.api.docker.impl;
  2. import com.spotify.docker.client.*;
  3. import com.spotify.docker.client.auth.ConfigFileRegistryAuthSupplier;
  4. import com.spotify.docker.client.auth.RegistryAuthSupplier;
  5. import com.spotify.docker.client.exceptions.DockerCertificateException;
  6. import com.spotify.docker.client.exceptions.DockerException;
  7. import com.spotify.docker.client.messages.Image;
  8. import com.spotify.docker.client.messages.ProgressMessage;
  9. import lombok.extern.apachecommons.CommonsLog;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.boot.system.ApplicationHome;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.ResourceUtils;
  15. import seecoder.devcloud.api.ApplicationProperties;
  16. import seecoder.devcloud.api.docker.DockerApi;
  17. import java.io.File;
  18. import java.io.FileNotFoundException;
  19. import java.io.IOException;
  20. import java.net.URI;
  21. import java.nio.file.Path;
  22. import java.nio.file.Paths;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. @Component
  26. @CommonsLog
  27. @Slf4j
  28. public class DockerApiImpl implements DockerApi {
  29. private final DockerClient client;
  30. private final ProgressHandler defaultHandler;
  31. private final RegistryAuthSupplier registryAuthSupplier;
  32. private final String registry;
  33. @Autowired
  34. public DockerApiImpl(ApplicationProperties properties) throws DockerCertificateException {
  35. registry = properties.getDocker().getRegistry();
  36. Path dockerConfigPath = null;
  37. try {
  38. dockerConfigPath = ResourceUtils.getFile("classpath:docker").toPath();
  39. if (properties.getDocker().getTls()){
  40. client = new DefaultDockerClient(URI.create(properties.getDocker().getHost()), new DockerCertificates(dockerConfigPath));
  41. log.info("Docker 启用tls验证");
  42. } else {
  43. client = new DefaultDockerClient(properties.getDocker().getHost());
  44. log.info("Docker 未启用tls验证");
  45. }
  46. } catch (FileNotFoundException e) {
  47. throw new DockerCertificateException("设置读取失败");
  48. }
  49. defaultHandler = new NoActionProgressHandler();
  50. ApplicationHome applicationHome = new ApplicationHome(getClass());
  51. // Path path = Paths.get(applicationHome.getDir().getAbsolutePath(), "docker-config.json");
  52. registryAuthSupplier = new ConfigFileRegistryAuthSupplier(new DockerConfigReader(), Paths.get(dockerConfigPath.toString(),"docker-config.json"));
  53. }
  54. @Override
  55. public void buildAndPush(String directory, String imageName, String imageTag, ProgressHandler handler) throws Exception {
  56. String imageId = client.build(new File(directory).toPath(), handler, DockerClient.BuildParam.name(registry + "/" + imageName + ":" + imageTag), DockerClient.BuildParam.forceRm());
  57. if (imageId == null) {
  58. throw new IOException("Failed to build docker image under [" + directory + "]");
  59. }
  60. client.push(registry + "/" + imageName + ":" + imageTag, new LogActionProgressHandler(), registryAuthSupplier.authFor(registry + "/" + imageName + ":" + imageTag));
  61. }
  62. @Override
  63. public void buildAndPush(String directory, String imageName, String imageTag) throws Exception {
  64. buildAndPush(directory, imageName, imageTag, defaultHandler);
  65. }
  66. public List<Image> listImage() {
  67. List<Image> images = new ArrayList<>();
  68. try {
  69. images = client.listImages(DockerClient.ListImagesParam.allImages());
  70. } catch (DockerException | InterruptedException e) {
  71. e.printStackTrace();
  72. }
  73. return images;
  74. }
  75. public void delete(String imageId) throws DockerException, InterruptedException {
  76. client.removeImage(imageId);
  77. }
  78. private static class NoActionProgressHandler implements ProgressHandler {
  79. @Override
  80. public void progress(ProgressMessage message) {
  81. //IGNORE THE MESSAGE
  82. }
  83. }
  84. private static class LogActionProgressHandler implements ProgressHandler {
  85. @Override
  86. public void progress(ProgressMessage message) {
  87. System.out.println(message);
  88. }
  89. }
  90. }