【问题标题】:How do I deal with the "max depth exceeded" error in docker?如何处理 docker 中的“超出最大深度”错误?
【发布时间】:2021-01-18 12:59:43
【问题描述】:

我从以前的同事那里继承了一个基本映像。我只有图像,没有与之对应的dockerfile。图像是下面的名称“c1829df3bbea”。当我运行这个命令时,我看到它有 167 层:

docker history c1829df3bbea | wc -l

现在一些公司配置发生了变化,需要我向图像中添加一些新文件。我在下面创建了 Dockerfile,它使用原始图像作为基础层:

FROM rbc/pmcs/dna_prod:latest

USER root

# Copy the run script to the docker container
COPY bin/run.sh $PMCS_HOME/run.sh

# Now copy in the most recent hadoop config files, as required by the migration to Range KMS on Saturday Sep 26 2020
COPY edlhp1-config/edlhp1/hadoop /app/hadoop_conf/strprod/hadoop

# Update the security certificates to the most recent versions
RUN cd /etc/pki/ca-trust/source/anchors && curl --insecure -O https://webapps4.fg.rbc.com/WLM0/Forms/Help/Production_RBC_G2_Root_CA.cer && curl --insecure -O https://webapps4.fg.rbc.com/WLM0/Forms/Help/Production_RBC_G2_Intermediate_CA.cer && update-ca-trust extract && ls /etc/pki/ca-trust/source/anchors && update-ca-trust force enable && update-ca-trust extract && chmod 755 $PMCS_HOME/run.sh

USER $USER

然后我使用命令重建:

docker build . --tag rbc/pmcs/prod:1.2

它可以加载 6 个步骤中的 5 个,但在最后一步失败,并显示消息“超出最大深度”。

我意识到可以做一些事情来减少层数,例如组合运行语句,以及使复制语句一次移动多个文件。请假设这已尽可能地完成。我想知道当我无法访问用于构建基础镜像的 Dockerfile 时,是否有办法减少基础镜像中的层数。

【问题讨论】:

  • 我不知道,但this question 可能有一些工具可以帮助您解决问题。
  • 您可以尝试修剪悬挂的容器和图像:docker container prunedocker image prune(来自 stackoverflow.com/a/61824081/5666087
  • @jakub 不会对具有太多层的基础图像产生影响。
  • 恐怕你已经发现了没有 Dockerfile 和源来构建镜像的问题。现在最好的方法是创建该 Dockerfile 并替换该基础映像。

标签: docker


【解决方案1】:

当我运行这个命令时,我看到它有 167 层:

哇。那是相当大的。

我不确定你是怎么来到这里的,但我敢打赌你(或者更确切地说,你的同事)在你的 Dockerfile 中使用了 FROM 命令,它引用了 Dockerfile 的输出,然后继续在配置更改时最重要的。

展望未来,我认为您可以压缩映像或对 Dockerfile 进行逆向工程。从长远来看,对 Dockerfile 进行逆向工程可能比压缩更好,尽管压缩可以立即解决问题。

挤压

每个图层都会从图像中添加和减去一些文件。基本上,压缩获取所有添加的文件,并创建一个代表所有添加的单个层。这违背了 Docker 智能区分层并仅发送图像中发生变化的层的策略,因此它没有被广泛使用。

有多种压缩图像的方法。

  1. 您可以使用名为 docker-squash 的工具执行此操作。
  2. 您可以运行docker export <image hash> | docker import -。这会将映像的根文件系统导出为 tarball,然后再次导入该映像。这将丢失各种配置数据,例如卷和暴露的端口。 YMMV。

逆向工程

您可以运行以下命令:

docker history <image hash> --format "{{.CreatedBy}}" --no-trunc | tac

这将为您提供用于创建图像的命令。但是,如果您将文件或目录复制到图像中,它只会显示哈希值和目标路径,因此您必须做一些工作才能弄清楚它在做什么。

您也可以使用dive 来了解每一层在做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-03
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多