| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- package seecoder.devcloud.api.docker.impl;
- import com.spotify.docker.client.*;
- import com.spotify.docker.client.auth.ConfigFileRegistryAuthSupplier;
- import com.spotify.docker.client.auth.RegistryAuthSupplier;
- import com.spotify.docker.client.exceptions.DockerCertificateException;
- import com.spotify.docker.client.exceptions.DockerException;
- import com.spotify.docker.client.messages.Image;
- import com.spotify.docker.client.messages.ProgressMessage;
- import lombok.extern.apachecommons.CommonsLog;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.system.ApplicationHome;
- import org.springframework.stereotype.Component;
- import org.springframework.util.ResourceUtils;
- import seecoder.devcloud.api.ApplicationProperties;
- import seecoder.devcloud.api.docker.DockerApi;
- import java.io.File;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.net.URI;
- import java.nio.file.Path;
- import java.nio.file.Paths;
- import java.util.ArrayList;
- import java.util.List;
- @Component
- @CommonsLog
- @Slf4j
- public class DockerApiImpl implements DockerApi {
- private final DockerClient client;
- private final ProgressHandler defaultHandler;
- private final RegistryAuthSupplier registryAuthSupplier;
- private final String registry;
- @Autowired
- public DockerApiImpl(ApplicationProperties properties) throws DockerCertificateException {
- registry = properties.getDocker().getRegistry();
- Path dockerConfigPath = null;
- try {
- dockerConfigPath = ResourceUtils.getFile("classpath:docker").toPath();
- if (properties.getDocker().getTls()){
- client = new DefaultDockerClient(URI.create(properties.getDocker().getHost()), new DockerCertificates(dockerConfigPath));
- log.info("Docker 启用tls验证");
- } else {
- client = new DefaultDockerClient(properties.getDocker().getHost());
- log.info("Docker 未启用tls验证");
- }
- } catch (FileNotFoundException e) {
- throw new DockerCertificateException("设置读取失败");
- }
- defaultHandler = new NoActionProgressHandler();
- ApplicationHome applicationHome = new ApplicationHome(getClass());
- // Path path = Paths.get(applicationHome.getDir().getAbsolutePath(), "docker-config.json");
- registryAuthSupplier = new ConfigFileRegistryAuthSupplier(new DockerConfigReader(), Paths.get(dockerConfigPath.toString(),"docker-config.json"));
- }
- @Override
- public void buildAndPush(String directory, String imageName, String imageTag, ProgressHandler handler) throws Exception {
- String imageId = client.build(new File(directory).toPath(), handler, DockerClient.BuildParam.name(registry + "/" + imageName + ":" + imageTag), DockerClient.BuildParam.forceRm());
- if (imageId == null) {
- throw new IOException("Failed to build docker image under [" + directory + "]");
- }
- client.push(registry + "/" + imageName + ":" + imageTag, new LogActionProgressHandler(), registryAuthSupplier.authFor(registry + "/" + imageName + ":" + imageTag));
- }
- @Override
- public void buildAndPush(String directory, String imageName, String imageTag) throws Exception {
- buildAndPush(directory, imageName, imageTag, defaultHandler);
- }
- public List<Image> listImage() {
- List<Image> images = new ArrayList<>();
- try {
- images = client.listImages(DockerClient.ListImagesParam.allImages());
- } catch (DockerException | InterruptedException e) {
- e.printStackTrace();
- }
- return images;
- }
- public void delete(String imageId) throws DockerException, InterruptedException {
- client.removeImage(imageId);
- }
- private static class NoActionProgressHandler implements ProgressHandler {
- @Override
- public void progress(ProgressMessage message) {
- //IGNORE THE MESSAGE
- }
- }
- private static class LogActionProgressHandler implements ProgressHandler {
- @Override
- public void progress(ProgressMessage message) {
- System.out.println(message);
- }
- }
- }
|