0

イメージを 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
4

1 に答える 1

0

この質問はすでにここで尋ねられており、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>
于 2021-03-02T05:11:50.927 に答える