我如何 运行 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文件不使用USER
和SHELL
命令,那么:
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
命令存储在图像中。即如果cmd
是my-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
在 Docker 文件中 Docker 运行s 命令与启动容器后手动 运行ning 命令的方式似乎有所不同。这似乎是由于您可以启动的 shell 类型,一个(我假设)非交互式 shell 与 Docker 文件与交互式文件 运行宁类似于 docker run -it <some-img-id>
.
如何在 Docker 容器中调试 运行ning 命令,使其 运行 与来自 Docker 的 运行 命令完全相同文件?将 /bin/bash --noprofile
添加到 run
cmd 就足够了吗?还是从 Docker 文件启动时环境有什么不同?
简答1:
如果Docker文件不使用USER
和SHELL
命令,那么:
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
命令存储在图像中。即如果cmd
是my-app
并且入口点是/bin/sh -c
,它执行/bin/sh -c my-app
. - 使用图像的默认用户 ID 启动它,它由 Docker 文件 中的最后一个
- 使用图像的 Docker 文件 commulative 中所有
USER
命令定义
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