Docker Ubuntu容器:与Bash链接的Shell仍然启动Shell。

4

大家好,我试图在基于ubuntu:14.04的docker容器中安装rvm。在这个过程中,我发现有些人会这样做来确保docker命令也能与bash一起运行:

RUN ln -fs /bin/bash /bin/sh

现在出现了一些奇怪的问题,我希望你们中的某个人可以向我解释一下:
→ docker run -it --rm d81ff50de1ce /bin/bash
root@e93a877ab3dc:/# ls -lah /bin
....
lrwxrwxrwx  1 root root    9 Mar  1 16:15 sh -> /bin/bash
lrwxrwxrwx  1 root root    9 Mar  1 16:15 sh.distrib -> /bin/bash
...
root@e93a877ab3dc:/# /bin/sh
sh-4.3# echo $0
/bin/sh

有人能解释一下这里发生了什么吗?我知道我可以在Dockerfile中使用bash -c前缀来执行命令,但我想了解这里正在发生的事情,并且如果可能的话仍然放弃在Dockerfile中使用bash -c前缀。

非常感谢, 罗宾

1个回答

2
这是因为bash有一个兼容模式,如果它通过名称“sh”启动,则尝试模拟 sh 的启动行为,如手册所述:
如果使用名称“sh”调用bash,则它会尽可能地模仿历史版本的sh的启动行为,同时遵循POSIX标准。当作为交互式登录shell或使用--login选项的非交互式shell调用时,它首先尝试按顺序从/ etc / profile和〜/ .profile读取和执行命令。可以使用--noprofile选项来禁止此行为。使用名称“sh”调用作为交互式shell时,bash查找变量ENV,展开其定义的值,并将展开的值用作要读取和执行的文件的名称。由于作为sh调用的shell不会尝试从任何其他启动文件中读取和执行命令,因此--rcfile选项无效。使用名称“sh”调用的非交互式shell不会尝试读取任何其他启动文件。当作为sh调用时,bash在读取启动文件后进入posix模式。

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