簡體   English   中英

使用Java Docker客戶端從映像重構dockerfile

[英]Reconstruct dockerfile from image with java docker client

我正在通過Java docker客戶端( https://github.com/docker-java/docker-java )在Java代碼中使用docker,我需要通過啟動docker pull操作的用戶請求來分析docker hub的內容(這將是在群集上的docker容器中遠程運行與計算生物學相關的用戶定義代碼的服務)。 我發現了基於紅寶石的這種方法: 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM