如何在 Dockerfile 本身中设置断点?

Mar*_*hac 2 breakpoints docker dockerfile docker-image docker-build

搜索上面显示了许多关于如何为在 docker 容器中运行的应用程序设置断点的结果,但我对在Dockerfile 自身中设置断点很感兴趣,以便docker build在断点处暂停。例如Dockerfile

FROM ubuntu:20.04

RUN echo "hello"
RUN echo "bye"
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来设置断点,RUN echo "bye"这样当我调试它时Dockerfile,图像将非交互式地构建到这RUN echo "bye"一点,独占。之后,我将能够与容器交互运行命令。在实际的Dockerfile我,有RUN断点变革的图像的文件系统正在建立之前S,我想能够以交互方式运行命令来分析在断点图像的文件系统像cd/ ls/find在时间断点。

Nic*_*ell 6

我认为这不可能直接实现——该功能已被讨论并被拒绝。

我通常调试 Dockerfile 的方法是注释“断点”之后的所有步骤,然后运行docker builddocker run -it image bashdocker run -it image sh取决于容器内是否安装了 bash)。
然后,我有一个交互式 shell,我可以运行命令来调试后续阶段失败的原因。

不过,我同意能够设置断点并进行探索将是一个方便的功能。


Dav*_*aze 5

本身无法设置断点,但您可以在构建序列中的任意点(步骤之间)获得交互式 shell。

让我们建立你的形象:

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:20.04
 ---> 1e4467b07108
Step 2/3 : RUN echo "hello"
 ---> Running in 917b34190e35
hello
Removing intermediate container 917b34190e35
 ---> 12ebbdc1e72d
Step 3/3 : RUN echo "bye"
 ---> Running in c2a4a71ae444
bye
Removing intermediate container c2a4a71ae444
 ---> 3c52993b0185
Successfully built 3c52993b0185
Run Code Online (Sandbox Code Playgroud)

---> 0123456789ab带有十六进制 ID 的每一行都有一个有效的图像 ID。所以从这里你可以

docker run --rm -it 12ebbdc1e72d sh
Run Code Online (Sandbox Code Playgroud)

这将为您提供第一个RUN命令产生的部分图像上的交互式外壳。

没有要求构建作为一个整体成功。如果某个RUN步骤失败,您可以使用此技术在该步骤之前立即在映像上获取交互式 shell,然后手动重新运行该命令。如果您有一个很长的RUN命令,您可能需要将它分成两部分,以便能够在命令序列中的特定点获得调试 shell。

  • [从 Docker buildkit 获取容器 ID 以进行交互式调试](/sf/ask/4633063431/) 有一种替代方法。 (2认同)