无法使用包含退出命令的 Bash 脚本退出 Docker 容器

3

当我在容器环境中输入 exit 命令时,我可以成功退出。但是,如果我尝试运行一个包含 exit 命令的脚本文件,我将无法从容器中退出。

1. 工作中

ubuntu@iot-docker:/repo$ exit
exit
 
root@iot-docker:/repo# exit
exit

ubuntu@ubuntu-***-Twr:~/shirisha/plo-***-snt-sp_u103a3$ 

  1. 无法工作
script.sh
   
#!/bin/bash
exit
   
exit

1
你实际上希望它做什么?exit退出脚本。 - jordanm
期望通过执行'script.sh'脚本退出容器。 - shirisha
期望的输出 - ubuntu@ubuntu--Twr:~/shirisha/plo--snt-sp_u103a3$ - shirisha
1
你是如何调用 script.sh 的?是从 compose 文件中调用的吗?还是通过 docker exec 命令调用的?或者是直接在容器内部的命令行中调用的? - xdhmoore
那么我建议使用@xhienne的答案。 - xdhmoore
显示剩余4条评论
2个回答

1

exit不是退出容器的命令,它只是退出当前的shell解释器。

当你运行脚本时,根据脚本的第一行(这里是/bin/bash),会启动一个新的shell解释器。当它遇到exit命令时,解释器停止,然后回到命令行(之前的shell)。

你可以进行这个实验:

$ bash     # Starts a new shell
$ exit     # Exits the new shell; we come back to the old one
exit
$ 

看到了吗?在命令行中运行bash类似于运行您的脚本,并且从其中退出会将您带回之前的shell。您没有退出容器。

解决方案:

exec script.sh param1 ... paramN

exec 命令会用被启动的命令(script.sh)替换当前的 shell。当该命令退出后,您将退出容器,因为旧的 shell 不再存在。


谢谢!@xhienne - shirisha
我必须运行两次“exec script.sh”才能退出容器。有没有办法只运行一次? - shirisha
我不明白这是怎么可能的,特别是因为在你的问题中只需要一个手动退出。如果你必须运行两次,那么这意味着你有一个已经运行了另一个shell解释器的shell解释器。你没有像我的实验一样调用bash,对吗?(那只是一个实验) - xhienne
启动Docker时,使用yocto_build.sh文件(其中包含docker run命令)。尝试退出Docker容器而不是输入"exit"命令两次以退出容器,在script.sh中添加了两次退出命令并尝试执行它。 - shirisha
@shirisha如果我理解正确,您必须手动两次输入“exit”(在命令行上)才能退出您的shell?这是在您的问题中显示的内容吗?在您的问题中,一个退出似乎会退出非特权用户($提示符)的susudo shell。第二个用于退出root的主shell(提示符)。如果您的问题是正确的,您似乎有一个执行非特权shell的东西。由于这与您的安装相关,因此我几乎无法提供更多帮助。 - xhienne

0
当您编写一个脚本而没有“源”该脚本时,该脚本将在新的子进程中启动。 exit 起作用,您将结束该子进程。
重要的是要记住,脚本会启动一个新环境。

查看脚本示例.sh

#!/bin/bash
my_value=high
cd /tmp

使用以下命令调用此脚本

cd $HOME
my_value="low"
./example.sh
pwd
echo "My value is now ${my_value}"

现在什么也没变:子进程中的所有更改都消失了。
您可以使用source ./example.sh(或简写为. ./example.sh)调用此脚本, 然后事情就会改变。

当您不想源化脚本时,函数(在.bashrc中)可能会有所帮助:

example() {
   my_value=high
   cd /tmp
}

现在你可以调用这个函数:
cd $HOME
my_value="low"
example
pwd
echo "My value is now ${my_value}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接