无法使用包含 exit 命令的 bash 脚本退出 docker 容器

问题描述 投票:0回答: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
bash docker
3个回答
1
投票

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

当您运行脚本时,将根据脚本的第一行启动一个新的 shell 解释器(此处为

/bin/bash
)。当遇到
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
将用正在启动的命令替换当前的 shell (
script.sh
)。当该命令退出时,您将退出容器,因为旧的 shell 不再存在。


0
投票

当您在没有“采购”脚本的情况下编写脚本时,该脚本将在新的子进程中启动。

exit
有效,您将完成该子流程。
重要的是要记住,脚本会启动一个新环境。

查看脚本example.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}"

0
投票

有人找到答案了吗?

我也有类似的需求。如果用户输入不正确的密码,我想退出容器本身。我有一个脚本,运行时会提示输入密码。如果用户输入的密码不正确,那么我想退出容器。仅使用

exit
命令,它只会退出 shell 解释器,而不会退出容器。我也尝试过终止进程,但它也不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.