使用 java docker 客户端从图像重建 docker 文件
Reconstruct dockerfile from image with java docker client
我通过 java docker 客户端在 java 代码中使用 docker (https://github.com/docker-java/docker-java) and I need to analyze what's coming from docker hub by user request starting docker pull operation (it's going to be a service running user-defined code related to computational biology in docker container on cluster remotely). I've found this approach based on ruby: https://github.com/CenturyLinkLabs/dockerfile-from-image/blob/master/dockerfile-from-image.rb
所以我很好奇 java 中是否已经实现了类似的代码?我知道这看起来很懒惰,代码应该很容易移植。但我不是要求为我做这件事。我只要求检查已经有人完成(和测试)的案例,在这种情况下我不需要重新发明轮子。
看起来没有人可以提出一些已知的解决方案。以防万一有人感兴趣:
public static List<String> reconstructDockerfile(DockerClient cl, String imageIdOrTag) throws Exception {
Image img = null;
Map<String, Image> idToImage = new HashMap<String, Image>();
for (Image image: cl.listImagesCmd().withShowAll(true).exec()) {
idToImage.put(image.getId(), image);
if (image.getId().equals(imageIdOrTag))
img = image;
if (image.getRepoTags() != null)
for (String imageTag : image.getRepoTags())
if (imageTag.equals(imageIdOrTag))
img = image;
}
if (img == null)
throw new IllegalArgumentException("Image id or tag wasn't found: " + imageIdOrTag);
List<String> cmds = new ArrayList<String>();
String fromTag = null;
while (true) {
InspectImageResponse iir = cl.inspectImageCmd(img.getId()).exec();
String[] cmd = iir.getContainerConfig().getCmd();
String cmdLine;
if (cmd.length == 3 && cmd[0].equals("/bin/sh") && cmd[1].equals("-c")) {
cmdLine = cmd[2];
if (cmdLine.startsWith("#(nop) ")) {
cmdLine = cmdLine.substring(7);
} else {
cmdLine = "RUN " + cmdLine;
}
} else {
cmdLine ="Unexpected command format: " + Arrays.asList(cmd);
}
cmds.add(0, cmdLine + " #### ---> " + img.getId());
String imageId = img.getParentId();
if (imageId == null || imageId.trim().isEmpty())
break;
img = idToImage.get(imageId);
if (img.getRepoTags().length >= 1 && !img.getRepoTags()[0].equals("<none>:<none>")) {
fromTag = img.getRepoTags()[0];
break;
}
}
if (fromTag != null)
cmds.add(0, "FROM " + fromTag);
return cmds;
}
我通过 java docker 客户端在 java 代码中使用 docker (https://github.com/docker-java/docker-java) and I need to analyze what's coming from docker hub by user request starting docker pull operation (it's going to be a service running user-defined code related to computational biology in docker container on cluster remotely). I've found this approach based on ruby: https://github.com/CenturyLinkLabs/dockerfile-from-image/blob/master/dockerfile-from-image.rb
所以我很好奇 java 中是否已经实现了类似的代码?我知道这看起来很懒惰,代码应该很容易移植。但我不是要求为我做这件事。我只要求检查已经有人完成(和测试)的案例,在这种情况下我不需要重新发明轮子。
看起来没有人可以提出一些已知的解决方案。以防万一有人感兴趣:
public static List<String> reconstructDockerfile(DockerClient cl, String imageIdOrTag) throws Exception {
Image img = null;
Map<String, Image> idToImage = new HashMap<String, Image>();
for (Image image: cl.listImagesCmd().withShowAll(true).exec()) {
idToImage.put(image.getId(), image);
if (image.getId().equals(imageIdOrTag))
img = image;
if (image.getRepoTags() != null)
for (String imageTag : image.getRepoTags())
if (imageTag.equals(imageIdOrTag))
img = image;
}
if (img == null)
throw new IllegalArgumentException("Image id or tag wasn't found: " + imageIdOrTag);
List<String> cmds = new ArrayList<String>();
String fromTag = null;
while (true) {
InspectImageResponse iir = cl.inspectImageCmd(img.getId()).exec();
String[] cmd = iir.getContainerConfig().getCmd();
String cmdLine;
if (cmd.length == 3 && cmd[0].equals("/bin/sh") && cmd[1].equals("-c")) {
cmdLine = cmd[2];
if (cmdLine.startsWith("#(nop) ")) {
cmdLine = cmdLine.substring(7);
} else {
cmdLine = "RUN " + cmdLine;
}
} else {
cmdLine ="Unexpected command format: " + Arrays.asList(cmd);
}
cmds.add(0, cmdLine + " #### ---> " + img.getId());
String imageId = img.getParentId();
if (imageId == null || imageId.trim().isEmpty())
break;
img = idToImage.get(imageId);
if (img.getRepoTags().length >= 1 && !img.getRepoTags()[0].equals("<none>:<none>")) {
fromTag = img.getRepoTags()[0];
break;
}
}
if (fromTag != null)
cmds.add(0, "FROM " + fromTag);
return cmds;
}