首页 > 解决方案 > 如何在 Docker 容器中执行多个命令并使 shell 会话保持打开状态?

问题描述

我有一个正在运行的 Docker 容器,需要在容器内启动交互式 shell 会话,并在此之前执行多个命令。我怎样才能做到这一点?

我试过了

docker exec -it foo bash < my_commands_to_exexute_inside_the_container.sh

docker run foo bash -c "echo Foo;echo Bar"

但这些都不起作用。第一个不执行脚本中的命令,第二个执行此操作,但关闭终端会话。

任何想法?顺便说一句:命令应该来自容器外部。容器中没有包含这些命令的文件。

编辑:

以下几乎完全符合我的要求。唯一的问题是第一个命令关闭 shell,第二个命令再次打开它。这导致我丢失环境变量。

docker exec -i foo bash < "cli.sh"
docker exec -it foo bash

有没有办法在关闭外壳的情况下实现这种行为?

标签: docker

解决方案


在你的第一个命令中删除-t(你正在运行一个脚本,而不是手动与 shell 提示交互,所以你不需要分配一个 TTY):

docker exec -i foo bash < my_commands_to_exexute_inside_the_container.sh

例如,如果我启动一个 Fedora 容器:

docker run -d --name shell fedora:34 sleep inf

我有一个mycommands.sh包含以下内容的文件:

echo "The time is $(date)"
echo "This system is: $(uname -a)"

我可以像这样在容器中执行该外壳:

$ docker exec -i shell bash < mycommands.sh
The time is Sat Jul 31 12:37:59 UTC 2021
This system is: Linux 50715db46e9b 5.12.14-300.fc34.x86_64 #1 SMP Wed Jun 30 18:30:21 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

推荐阅读