2015-10-06 24 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; 
}