【问题标题】:Docker - max depth exceededDocker - 超出最大深度
【发布时间】:2017-11-13 20:03:13
【问题描述】:

所以我用这个例子:

https://github.com/mcmoe/mssqldocker

为了创建 SQL Server 映像并加载数据。我有几个运行容器时运行的 sql 脚本。

但是,我在构建映像时开始收到此错误:

Step 7/9 : ENTRYPOINT ./entrypoint.sh
 ---> Running in c8c654f6a630
max depth exceeded

我不确定如何解决这个问题,我重新启动了 docker,甚至更新了它。 我读了一些关于 125 层的东西?谁能解释造成这种情况的原因和可能的解决方法?

我发现这个命令可以运行:

docker history microsoft/mssql-server-linux:latest | wc -l
 312

我的 docker-compose yml:

version: "3"
services:
  mssql:
      build: .
      image: 'microsoft/mssql-server-linux'
      ports:
          - '1433:1433'
      environment:
          - ACCEPT_EULA=Y
          - SA_PASSWORD=Abcgfgh123!
      volumes:
          - db_volume:/var/lib/mssql/data
volumes:
  db_volume:

【问题讨论】:

  • docker history microsoft/mssql-server-linux:latest | wc -l 对我来说是 16 吗?
  • 我的怎么会这么大,我最近一直在做很多 docker-compose down 和 builds,所以我不确定它为什么会增长?
  • 另外,该图像在后台启动 sql server,因此 tail 用作容器中的主进程,这不好。查看官方postgresmysql 镜像入口点,了解如何初始化数据并仍将数据库作为主进程运行。
  • 谢谢 - 任何提示对此表示赞赏,我对此很陌生,所以我不确定尾巴在做什么,
  • 可能是一个狡猾的构建,尝试再次拉动它? docker pull microsoft/mssql-server-linux:latest

标签: docker docker-compose


【解决方案1】:

docker-compose.yml 定义中serviceimage 参数具有双重含义,具体取决于build 参数的存在。

  • 如果没有build 节,image 将被拉出并运行。

  • 如果您有 build 节,image 将是您构建的名称 图像被标记为,然后运行。

通过命名构建的镜像microsoft/mssql-server-linux,与FROM microsoft/mssql-server-linux镜像相同。 Docker 每次都将构建分层。

最初的构建从“官方”microsoft/mssql-server-linux 开始,但随后的每个后续构建都将从附加到的本地 microsoft/mssql-server-linux 图像开始,直到最终达到存储驱动程序的最大层数。

为您构建的所有图像使用您自己的命名空间:

version: "3"
services:
  mssql:
      build: .
      image: 'user3437721/mssql-server-linux'

【讨论】:

  • 非常感谢,还在学习中,这对您有很大帮助
  • 帮助很大!
  • 现在更有意义了。我一直想知道为什么我必须在 docker-compose.yml 和 Dockerfile 中都指定图像。
【解决方案2】:

使用以下命令删除与您的 dockerfile 相关的所有本地 docker 映像,然后重试。

$ docker rmi -f $(docker images -a -q)

【讨论】:

  • 我在这种情况下使用 linux 容器在 windows 10 pro 上的解决方案
  • 使用 Unix 容器在 Arch/Manjaro 上为我工作
  • 这实际上不是解决根本问题的方法,但是一旦你发现自己处于这种状态,它是一个有用的清理命令。
【解决方案3】:

我已经在使用接受的答案中的自定义图像名称,但我仍然遇到这个问题。

为了克服这个错误,我发现我需要使用以下命令删除所有未使用的(不与任何容器关联的)和悬空的(制作新图像后的旧图像)docker 图像:

docker image prune -a

https://linuxhandbook.com/remove-docker-images/

【讨论】:

    【解决方案4】:

    如果针对特定图像弹出此错误,那么您可能需要查看您所说的 docker 图像中存在的层数。在对 Docker 映像进行更改时,无论映像的大小增加多少,每个更改都会作为一个层添加。我遇到过我的 docker 镜像有多个层并且无法推送 Jenkins 作业的场景。解决方法是在 docker 映像中使用相同的上下文,但减少层数。为此,您可以简单地取出图像的内容并将它们移植到具有新图像名称的新图像中,这将在新图像中产生相同的内容并且层数更少。在有用的场景中使用此技巧。谢谢

    【讨论】:

      【解决方案5】:

      对于我的情况,错误是由于 \r.我正在运行 Windows 主机,并且 linux 映像需要为从 Windows 复制到 docker 映像的入口点运行脚本文件。在此过程中,脚本结束行从 \n 更改为 \r\n,从而导致此错误。撤消此操作会使错误消失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        • 2021-01-18
        • 2017-03-24
        • 2011-12-31
        • 2017-08-09
        • 2011-03-31
        相关资源
        最近更新 更多