我如何 运行 Docker cmds 与 Docker 文件中的完全一样

How do I Run Docker cmds Exactly Like in a Dockerfile

在 Docker 文件中 Docker 运行s 命令与启动容器后手动 运行ning 命令的方式似乎有所不同。这似乎是由于您可以启动的 shell 类型,一个(我假设)非交互式 shell 与 Docker 文件与交互式文件 运行宁类似于 docker run -it <some-img-id>.

如何在 Docker 容器中调试 运行ning 命令,使其 运行 与来自 Docker 的 运行 命令完全相同文件?将 /bin/bash --noprofile 添加到 run cmd 就足够了吗?还是从 Docker 文件启动时环境有什么不同?

简答1:

如果Docker文件不使用USERSHELL命令,那么:

docker --entrypoint "/bin/sh -c" -u root <image> cmd

简答2:

如果您在构建后不挤压或压缩图像,Docker 会为每个 Docker 文件命令创建图像层。您可以在 --->:

每个步骤结束时在 docker build 的输出中看到它们
Step 2/8 : WORKDIR /usr/src/app
  ---> 5a5964bed25d # <== THIS IS IMAGE ID OF STEP 2
Removing intermediate container b2bc9558e499
Step 3/8 : RUN something
  ---> f6e90f0a06e2 # <== THIS IS IMAGE ID OF STEP 3
Removing intermediate container b2bc9558e499

在您要调试的 运行 步骤之前查找图像 ID(例如,您要调试上面的第 3 步,使用第 2 步图像 ID)。然后只是 运行 该图像中的命令:

docker run -it 5a5964bed25d cmd

长答案1:

当您 运行 docker run [image] cmd Docker 实际上以这种方式启动 cmd 时:

  • cmd 作为参数执行图像的默认入口点。入口点通过 Docker 文件中的 ENTRYPOINT 命令存储在图像中。即如果cmdmy-app并且入口点是/bin/sh -c,它执行/bin/sh -c my-app.
  • 使用图像的默认用户 ID 启动它,它由 Docker 文件
  • 中的最后一个 USER 命令定义
  • 使用图像的 Docker 文件 commulative
  • 中所有 ENV 命令的环境变量启动它

docker build 运行 是 Docker 文件 RUN 时,它的作用完全相同,只是 [=当时(行)存在的值 Docker文件.

准确地说,您必须在 运行 行之前获取 ENV 和最后一个 USER 命令的值,并在 docker run 命令中使用它们。

最常见的图像以 /bin/sh -c/bin/bash -c 作为入口点,并且构建很可能使用 root 用户进行操作。因此 docker --entrypoint "/bin/bash -c" -u root <image> cmd 应该足够

您遇到的是 shell 引起的行为。我们大多数人都习惯使用 bash shell。所以通常我们会尝试 运行 以下方式的命令

对于新容器

docker run -it <imageid> bash

对于现有容器

docker exec -it <containerid> bash

但是当我们在 Docker 文件

中使用 RUN 指令指定一些命令时
RUN echo Testing

那么就相当于运行宁/bin/sh -c 'echo Testing'。所以你可以预料到某些差异,因为 shell 是不同的。

在 Docker 1.12 或更高版本中,您有一个名为 SHELL 的 Dockerfile 指令,这允许您覆盖默认 SHELL

SHELL ["/bin/bash", "-c"]
RUN echo Testing

这将使 RUN 命令作为 bash -c 'echo Testing' 执行。您可以了解有关 SHELL 指令的更多信息 here