2015-10-06 49 views
0

我在java代码中通过java docker客户端(https://github.com/docker-java/docker-java)使用docker,我需要分析docker hub由用户请求开始的docker pull操作(它将成为服务在集群上的Docker容器中远程运行与计算生物学相关的用户定义代码)。我发现这种方法基于红宝石:https://github.com/CenturyLinkLabs/dockerfile-from-image/blob/master/dockerfile-from-image.rb使用java docker客户端从图像中重建dockerfile

所以我很好奇,如果有一个类似的代码已经在java中实现?我知道它看起来像懒惰,代码应该很容易移植。但我并没有要求为我做这件事。我只是要求检查某个人已经完成(和测试)的情况,在这种情况下我不需要重新发明轮子。

回答

0

看起来没有人可以提出一些已知的解决方案。这里有人会感兴趣:

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; 
}