【问题标题】:Reconstruct dockerfile from image with java docker client使用 java docker 客户端从图像重建 dockerfile
【发布时间】:2016-01-03 22:10:27
【问题描述】:

我正在通过 java docker 客户端 (https://github.com/docker-java/docker-java) 在 java 代码中使用 docker,我需要通过启动 docker pull 操作的用户请求来分析来自 docker hub 的内容(这将是一个运行用户定义的相关代码的服务远程集群上的 docker 容器中的计算生物学)。我发现了这种基于 ruby​​ 的方法:https://github.com/CenturyLinkLabs/dockerfile-from-image/blob/master/dockerfile-from-image.rb

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

【问题讨论】:

    标签: java docker reverse-engineering dockerfile


    【解决方案1】:

    似乎没有人可以提出一些已知的解决方案。这是以防有人感兴趣:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      相关资源
      最近更新 更多