使用 docker-java 库将图像加载到 docker 时获取 Docker 图像名称
Get Docker Image Name when loading image to docker using docker-java lib
我正在尝试从 tar 文件将图像加载到 docker 并验证 tar 文件是否有效。
现在,如果 tar 文件有效,我需要获取图像名称和标签。
但是我检查了一下,exec 方法的 return 类型是无效的。
有谁知道我怎样才能得到图像名称和标签。
@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 并且他们 return 对 loadImageCmd 无效。
我找到了解决方法。
如果我们将 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>
我正在尝试从 tar 文件将图像加载到 docker 并验证 tar 文件是否有效。 现在,如果 tar 文件有效,我需要获取图像名称和标签。
但是我检查了一下,exec 方法的 return 类型是无效的。 有谁知道我怎样才能得到图像名称和标签。
@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 并且他们 return 对 loadImageCmd 无效。 我找到了解决方法。
如果我们将 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>