1. 概述

在使用 Docker 容器时,有时我们希望在容器中自动执行某个脚本,然后保留一个交互式 Shell 以便后续调试或检查容器状态。这在开发、测试或排查问题时非常有用。

本文将介绍如何在脚本执行后保持 Docker 容器的交互模式,方便我们进一步操作容器内容。


2. Docker 交互模式与命令执行

Docker 支持在执行命令的同时保持交互式 Shell,这对于自动运行脚本并进入调试状态非常有用。

2.1. 使用交互模式运行容器

我们可以通过 docker run 命令的 -it 参数分配一个终端并保持容器活跃状态。

hello-world 镜像为例:

$ docker run -it hello-world --name hello

参数说明:

  • docker run:从指定镜像启动容器
  • -i:保持标准输入(STDIN)打开,支持交互
  • -t:分配一个伪终端(pseudo-TTY),让我们可以像在终端一样操作容器

2.2. 先创建再启动容器

我们也可以先创建容器,稍后再启动:

$ docker create -it hello-world --name hello
$ docker start hello

这种方式更灵活,尤其当我们需要多次进入同一个容器时。

2.3. 执行命令并进入 Bash Shell

我们可以通过 sh -c 同时执行命令并保留 Shell:

$ docker run -it python:3.9-slim sh -c "python -c 'print(\"Hello from Python\")' && exec bash"

输出示例:

Hello from Python
root@1dbf38668053:/#

解释:

  • python -c:执行 Python 脚本
  • exec bash:打开交互式 Bash Shell

3. 示例:交互模式与脚本执行结合

3.1. 使用 Dockerfile

我们创建一个 Python 脚本 script.py

# script.py
with open("/app/output.txt", "w") as f:
    f.write("This file was created by script.py inside the Docker container.\n")

对应的 Dockerfile:

FROM python:3.9-slim
WORKDIR /app
COPY script.py .
CMD ["sh", "-c", "python script.py && exec bash"]

构建并运行容器:

$ docker build -t python-interactive-mode .
$ docker run -it python-interactive-mode

或者:

docker create -it --name python-interactive-mode python-interactive-mode
docker start python-interactive-mode
docker exec -it python-interactive-mode bash

3.2. 使用命令行方式

我们也可以不写 Dockerfile,直接挂载脚本文件运行:

docker run -it \
    -v "$(pwd)/script.py:/app/script.py" \
    python:3.9-slim \
    sh -c "python /app/script.py && exec bash"

这里使用了 -v 挂载本地脚本文件到容器中。

3.3. 验证容器内文件

进入容器后可以验证脚本是否执行成功:

root@beadfb9d2499:/app# cat output.txt 
This file was created by script.py inside the Docker container.

4. 替代方案

4.1. 容器执行完脚本后退出的问题

默认情况下,脚本执行完毕后容器会退出。我们可以通过以下方式再次进入:

$ docker start -ai python-interactive-mode

或者在 Dockerfile 中使用 tail -f /dev/null 保持容器运行:

CMD ["sh", "-c", "python script.py && tail -f /dev/null"]

4.2. ENTRYPOINT 与 CMD 结合使用

我们可以结合 ENTRYPOINTCMD,让脚本优先执行,并在之后进入 Shell:

ENTRYPOINT ["python", "script.py"]
CMD ["bash"]

这种方式更灵活,便于复用容器并传入不同命令。


5. 小结 ✅

本文介绍了如何在 Docker 容器中自动执行脚本后保留交互 Shell,便于后续调试和检查。

主要方法包括:

  • 使用 -it 参数启动交互式容器
  • 使用 sh -c 执行脚本并保留 Bash Shell
  • 通过 Dockerfile 构建镜像或命令行挂载脚本文件
  • 处理容器执行完脚本后自动退出的问题
  • 使用 ENTRYPOINTCMD 实现更灵活的命令组合

通过这些方法,我们可以更高效地调试和管理容器环境,避免重复手动操作。


原始标题:Docker Interactive Mode After Executing Script