如果你在 Dockerfile 中没有指定默认的运行命令(CMDENTRYPOINT),并且希望通过 docker run 命令在后台运行容器,可以按照以下步骤操作:

  1. 创建镜像: 首先,使用你的 Dockerfile 创建一个镜像。确保 Dockerfile 中没有设置默认的运行命令。

  2. 后台运行容器: 使用 docker run -d 命令在后台运行容器。例如:

    docker run -d <镜像名称或ID>
    

    这将在后台运行容器,但由于没有默认的运行命令,容器会立即退出。但容器本身会保持在后台运行状态。

  3. 进入容器: 使用 docker exec 命令进入容器,并在容器内手动执行所需的命令。例如:

    docker exec -it <容器ID或名称> /bin/bash
    

    在容器内部,你可以手动运行任何你需要的命令。

请注意,当你使用 docker exec 命令进入容器内部时,每个会话都是临时的,容器不会保存会话之间的状态。如果容器在后台运行的同时需要保留状态,你可能需要考虑使用卷(volumes)或映射等方法来处理数据非常抱歉,之前的回答可能有误。根据你的实际测试,使用 -itd 参数组合能够让容器在后台运行并保持运行状态,即使没有指定默认的运行指令(CMDENTRYPOINT)。这种情况下,容器会保持运行状态,你仍然可以使用 docker exec 命令进入容器内部。

所以,根据你的实际测试结果,docker run -itd 可以达到你想要的效果,即在后台运行容器,并保持容器持续运行。我为之前的回答所造成的混淆向你道歉。

你可以继续使用 docker run -itd 来达到你想要的效果,它可以让容器在后台运行并保持运行状态。非常感谢你的耐心和当你在使用 docker run 命令时,可以通过添加不同的参数来控制容器的运行方式。以下是 -i-t-d 参数的详细解释:

  • -i:表示 “交互模式”(Interactive Mode)。启用这个参数会让容器的标准输入(stdin)保持打开状态,允许你与容器进行交互,如在容器内输入命令。如果你不使用这个参数,容器的标准输入将会关闭,你将无法在容器内输入内容。

  • -t:表示 “终端模式”(TTY Mode)。启用这个参数会分配一个伪终端(TTY),使容器的输出以更友好的方式呈现,类似于终端的输出。如果你不使用这个参数,容器的输出可能会以不易阅读的方式呈现。

  • -d:表示 “后台模式”(Detached Mode)。启用这个参数会让容器在后台运行,不会阻塞当前终端。你将会看到一个容器的唯一ID,这表示容器正在后台运行。如果你不使用这个参数,容器会在前台运行,并将终端会话与容器关联。

所以,docker run -itd 命令会在后台运行容器,并保持标准输入打开和分配伪终端,以便你能够在容器内部进行交互。这通常用于需要交互式操作的情况,如进入容器内部执行抱歉再次造成了混淆。我解释得不够清楚。让我重新澄清一下。

当你在使用 -i 参数(交互模式)时,你能够将输入传递给容器的标准输入(stdin),从而可以在容器内部进行交互性操作,输入命令等。但是,如果只使用 -i 参数而不使用 -t 参数(终端模式),容器的输出可能会以未格式化的方式呈现,不会像在终端中看到的那样友好。

当没有使用 -t 参数时,容器的输出不会被格式化为终端样式,这可能会导致输出显示不正常、难以阅读,或者丢失一些终端样式特性(如颜色等)。

综上所述,使用 -i 参数能够保持标准输入打开,但如果你希望容器的输出能够以终端样式进行格式化以便更轻松阅读,你需要同时使用 -t 参数,即 -it。这样,你可以在容器内部进行交互操作,并且容器的输出会以终端的方式进行当在 Docker 中使用 -t-i 参数时,容器的输出会与终端显示更相似,而不使用这些参数时,容器的输出可能会显得更加原始和不易阅读。以下是一些示例来说明这两种情况之间的差异:

使用 -it 参数:
假设你有一个简单的容器,其中的 /app/script.sh 脚本文件会输出一些信息,类似于:

#!/bin/bash
echo "Hello, Docker!"
echo "This is a sample script."
  1. 使用命令 docker run -it <镜像名称> 启动容器,同时进入交互式终端。容器中的输出将以终端样式进行格式化,你将能够清楚地看到颜色和格式:

    Hello, Docker!
    This is a sample script.
    

不使用 -it 参数:

  1. 使用命令 docker run -i <镜像名称> 启动容器,进入交互式终端,但不使用 -t 参数。容器中的输出可能会没有终端样式,看起来较原始:

    Hello, Docker!
    This is a sample script.
    
  2. 使用命令 docker run -i <镜像名称> 启动容器,同样不使用 -t 参数,但是在容器中的输出不会以终端样式进行格式化:

    Hello, Docker!This is a sample script.
    

总之,使用 -it 参数能够在容器中启用终端样式,使得容器的输出更加易读,同时也能够让你进行交互式操作。如果只使用 -i 参数,容器的输出可能会没有格式化,而不利于是的,你理解得对。没有使用 -t 参数时,容器的输出可能会在一行内显示,而没有进行换行,这可能会导致输出信息难以阅读。-t 参数会在容器的输出中添加终端样式,包括换行和其他终端相关的格式。

所以,使用 -t 参数可以确保容器的输出以更易读的终端样式进行格式化,其中包括换行,使得输出更容易阅读。而不使用 -t 参数,容器的输出可能会以更原始的方式显示,可能没有换行等终端格式化伪终端(Pseudo Terminal,简称PTY)是一种模拟终端设备的机制,用于在计算机系统中提供交互式命令行会话。它允许用户通过命令行界面与计算机进行交互,就像在物理终端上一样。

在Docker中,当你使用 -t 参数时,Docker会为容器分配一个伪终端,也就是一个虚拟的终端设备。这个伪终端与容器内的命令行交互,并将输出格式化为终端样式,包括颜色、换行等。

伪终端的功能是模拟一个真实的终端,以便在计算机系统中进行交互式命令行操作。在容器中使用 -t 参数可以让你在容器内部获得一个类似终端的环境,使你能够以更友好的方式与容器内部交互和查看输出。

综上所述,伪终端是一种模拟的终端设备,通过 -t 参数在容器中启用伪终端,使容器的输出在终端中以更易读的方式显示。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐