无法使用包含exit命令的bash脚本从docker容器中退出
在容器环境中输入无法使用包含exit命令的bash脚本从docker容器中退出,bash,docker,Bash,Docker,在容器环境中输入exit命令时,我可以退出。但是,如果我尝试使用exit命令运行脚本文件,则无法从容器中退出 1.工作 ubuntu@iot-docker:/repo$ exit exit root@iot-docker:/repo# exit exit ubuntu@ubuntu-***-Twr:~/shirisha/plo-***-snt-sp_u103a3$ 不起作用 当您编写脚本而不“源”脚本时,脚本将在新的子流程中启动。退出有效,您将完成该子流程。 重要的是要记住,脚本启动
exit
命令时,我可以退出。但是,如果我尝试使用exit
命令运行脚本文件,则无法从容器中退出
1.工作
ubuntu@iot-docker:/repo$ exit
exit
root@iot-docker:/repo# exit
exit
ubuntu@ubuntu-***-Twr:~/shirisha/plo-***-snt-sp_u103a3$
当您编写脚本而不“源”脚本时,脚本将在新的子流程中启动。
退出
有效,您将完成该子流程。重要的是要记住,脚本启动了一个新的环境 请看脚本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
(或short。/example.sh
)调用此脚本,
事情已经改变了
当您不想为脚本编写源代码时,函数(在.bashrc
中)可能会有帮助:
example() {
my_value=high
cd /tmp
}
现在您可以调用该函数:
cd $HOME
my_value="low"
example
pwd
echo "My value is now ${my_value}"
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已不存在。您实际希望它做什么<代码>退出退出脚本。希望通过执行“script.sh”从容器中退出ubuntu@iot-docker:/repo$cat script.sh#/bin/bash退出ubuntu@iot-docker:/repo$./script.shubuntu@iot-码头工人:/repo$ubuntu@iot-码头工人:/repo$预期-ubuntu@ubuntu--Twr:~/shirisha/plo--snt-sp_u103a3$如何调用script.sh?从一个合成文件?从docker exec
命令?直接通过容器内的命令行?谢谢@Xiennei必须运行“exec script.sh”两次才能退出容器。有什么办法可以让我运行一次吗?我不明白怎么可能,特别是因为在你的问题中,只有一次手动退出是必要的。如果您必须运行它两次,那么这意味着您有一个shell解释器,它已经运行了另一个shell解释器。你没有像在我的实验中那样给bash打电话,是吗?(这只是一个实验)为了启动docker,使用了yocto_build.sh文件(它有docker run命令)。试图从docker容器中退出,而不是两次输入“exit”命令以退出容器,在script.sh中添加了两次exit命令并尝试执行。@shirisha如果我理解正确,您必须手动输入两次exit
才能退出shell?这是你的问题所显示的吗?在您的问题中,对于非特权用户($
提示符),一个出口似乎是退出su
或sudo
shell。第二个用于退出root的主shell(#
提示符)。如果您的问题是正确的,那么您似乎有执行非特权shell的东西。我几乎帮不上什么忙,因为这与您的安装有关。
exec script.sh param1 ... paramN