首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用docker-java lib将镜像加载到Docker时获取docker镜像名称

使用docker-java lib将镜像加载到Docker时获取docker镜像名称
EN

Stack Overflow用户
提问于 2021-02-24 18:45:50
回答 1查看 107关注 0票数 0

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

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

代码语言:javascript
复制
@Autowired
private DockerClient dockerClient;

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

我正在使用下面的库

代码语言:javascript
复制
com.github.docker-java:docker-java:3.2.5
com.github.docker-java:docker-java-transport-httpclient5:3.2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-02 13:11:51

这个问题已经被问过了

这里

它们返回loadImageCmd的空值。我找到了解决此问题的方法。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
org.apache.commons
    commons-vfs2
    2.7.0

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

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
com.googlecode.json-simple
    json-simple
    1.1.1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66349275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档