【问题标题】:Docker unable to start an interactive shell if the image has an entry script如果镜像有入口脚本,Docker 无法启动交互式 shell
【发布时间】:2017-06-04 03:47:52
【问题描述】:

我的定制图片以

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

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

但是,当我尝试使用

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

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

由于-it 标志,我希望执行/bin/bash 并且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";

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

【问题讨论】:

  • 如果您发送 entry_script.sh 内容(如果可能)会有所帮助。
  • @FranGarcía:谢谢,我添加了它

标签: bash shell docker dockerfile


【解决方案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 标志将确保会话为您提供标准输入/标准输出,并为您分配一个伪 tty,但它们不会自动为您运行 bash。有些容器甚至没有 bash。

【讨论】:

    【解决方案2】:

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

    #!/bin/bash
    
    # Save original parameters
    allparams=("$@")
    
    echo "UPDATING GIT REPO";
    
    cd /home/tool/cloned_github_tools_root
    git pull
    git submodule init
    git submodule update
    
    echo "Entrypoint ended";
    
    # Forward initial parameters
    /bin/bash "${allparams[@]}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 2013-02-03
      • 1970-01-01
      相关资源
      最近更新 更多