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 结合使用
我们可以结合 ENTRYPOINT
和 CMD
,让脚本优先执行,并在之后进入 Shell:
ENTRYPOINT ["python", "script.py"]
CMD ["bash"]
这种方式更灵活,便于复用容器并传入不同命令。
5. 小结 ✅
本文介绍了如何在 Docker 容器中自动执行脚本后保留交互 Shell,便于后续调试和检查。
主要方法包括:
- 使用
-it
参数启动交互式容器 - 使用
sh -c
执行脚本并保留 Bash Shell - 通过 Dockerfile 构建镜像或命令行挂载脚本文件
- 处理容器执行完脚本后自动退出的问题
- 使用
ENTRYPOINT
和CMD
实现更灵活的命令组合
通过这些方法,我们可以更高效地调试和管理容器环境,避免重复手动操作。