【问题标题】:Get Docker Image Name when loading image to docker using docker-java lib使用 docker-java lib 将图像加载到 docker 时获取 Docker 图像名称
【发布时间】:2021-02-24 10:45:49
【问题描述】:

我正在尝试将图像从 tar 文件加载到 docker 并验证 tar 文件是否有效。 现在,如果 tar 文件有效,我需要获取 imageName 和标签。

但是我检查了 exec 方法的返回类型是 void。 有谁知道我怎样才能得到 imageName 和标签。

@Autowired
private DockerClient dockerClient;

public void loadImage(InputStream inputStream) {
        dockerClient.loadImageCmd(inputStream).exec();
}

我正在使用下面的库

com.github.docker-java:docker-java:3.2.5
com.github.docker-java:docker-java-transport-httpclient5:3.2

【问题讨论】:

    标签: java spring-boot docker loadimage docker-java


    【解决方案1】:

    这个问题已经被问到here 并且他们为 loadImageCmd 返回 void。 我找到了解决方法。

    如果我们将 tar 文件存储在某个位置,我们就可以读取清单文件并从中获取 repo 名称。

    import org.apache.commons.vfs2.FileContent;
    import org.apache.commons.vfs2.FileObject;
    import org.apache.commons.vfs2.FileSystemManager;
    import org.apache.commons.vfs2.FileType;
    import org.apache.commons.vfs2.VFS;
    
        public InputStream getManifestFileInputStream(String fileName){
                InputStream manifestInputStream = null;    
                FileObject archive;
                try {
                    FileSystemManager fsManager = VFS.getManager();
                    archive = fsManager.resolveFile("tar:file://" + fileName);
        
                    FileObject[] children = archive.getChildren();
                    for (int i = 0; i < children.length; i++) {
                        FileObject fo = children[i];
                        if (fo.isReadable() && fo.getType() == FileType.FILE
                            && fo.getName().toString().contains("manifest.json")) {
                            FileContent fc = fo.getContent();
                            manifestInputStream = fc.getInputStream();
                        }                
                    }
                    return manifestInputStream;
                } catch (Exception e)
                    return null;
                }
            }
    

    我使用下面的依赖来提取 manifest.json 的 inputStream

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-vfs2</artifactId>
        <version>2.7.0</version>
    </dependency>
    

    获得输入流后,将此输入流转换为 JSONArray 对象并获取 repoTag。

    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    
        public String getRepoName(InputStream inputStream) {
                String repoName = null;
                JSONParser parser = new JSONParser();
                try {
                    Object obj = parser.parse(new InputStreamReader(inputStream, "UTF-8"));            
                    JSONArray jsonArray = (JSONArray)obj;
                    if (!jsonArray.isEmpty()) {
                        JSONObject jsonObject = (JSONObject)jsonArray.get(0);
        
                        JSONArray repoTags = (JSONArray)jsonObject.get("RepoTags");
                        if (!repoTags.isEmpty()) {
                            repoName = (String)repoTags.get(0);
                        }
                    }
                    return repoName;
                } catch (Exception e) {
                    return repoName;
                }
            }
    

    使用下面的依赖将 inputStream 转换为 JsonArray 对象。

    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1.1</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多