微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 docker-java lib 将图像加载到 docker 时获取 Docker 图像名称

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

但是我查了一下,exec 方法的返回类型是无效的。 有谁知道如何获取 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

解决方法

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

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

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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?