如果映像具有条目脚本,Docker无法启动交互式shell

时间:2017-01-19 12:31:34

标签: bash shell docker dockerfile

我的自定义图片以

结尾
ENTRYPOINT [ "/bin/bash", "-c", "/home/tool/entry_script.sh" ]

这是绝对必要的,因为在运行时,用户必须做的第一件事是更新已经克隆的github项目,用户经常会忘记这样做。

但是,当我尝试使用

启动时
docker run -it --rm my_image /bin/bash

我可以看到正在执行ENTRYPOINT脚本,但随后是容器退出。

由于/bin/bash标志,我希望执行-it并使shell保持交互模式。

我做错了什么?

更新:我添加了我的输入脚本

#!/bin/bash

echo "UPDATING GIT REPO";

cd /home/tool/cloned_github_tools_root
git pull
git submodule init
git submodule update

echo "Entrypoint ended";
  

实际上我在运行时没有出现错误

2 个答案:

答案 0 :(得分:1)

在docker容器中设置和输入点时。它是唯一能运行的东西。它是唯一重要的过程(PID 1)。一旦你的entry_point.sh脚本完成运行并返回并退出代码,docker认为容器已完成它需要做的事情并退出,因为它内部的唯一进程退出。

如果要在容器内启动shell,可以修改入口点脚本,如下所示:

#!/bin/bash

echo "UPDATING GIT REPO";

cd /home/tool/cloned_github_tools_root
git pull
git submodule init
git submodule update

echo "Entrypoint ended";

/bin/bash "$@"

在repo更新完成后启动shell。现在,当用户退出shell时,容器将退出。

-i-t标志将确保会话为您提供stdin / stdout并为您分配psuedo-tty,但它们不会自动为您运行bash。有些容器甚至没有打包。

答案 1 :(得分:0)

我觉得原来的问题和答案都很好(谢谢!)。但是,我遇到了完全相同的问题,但提供的解决方案对我不起作用。我最终浪费了很多时间来弄清楚我做错了什么。因此,我想出了一个应该一直有效的解决方案,如果这可以为​​其他人节省时间。在我的 docker 入口点中,我从 Intel 编译器获取了一个 shell 脚本文件,并且接收到的参数 $@ 被“source”命令稍微改变了。然后当以 /bin/bash "$@" 结束脚本时,原始参数消失了。这是我的更新版本,它对所有用例都更安全:

MyClass.cc