Linux docker ubuntu容器:链接到bash的shell仍然启动shell
好了,伙计们,我试着在基于ubuntu:14.04的docker容器中安装rvm。在这个过程中,我发现有些人这样做是为了确保docker命令也能与bash一起运行:Linux docker ubuntu容器:链接到bash的shell仍然启动shell,linux,bash,shell,ubuntu,docker,Linux,Bash,Shell,Ubuntu,Docker,好了,伙计们,我试着在基于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
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 w/bash-c
中为我的命令添加前缀,但我想了解这里发生了什么,如果可能的话,仍然可以在dockerfile中删除bash-c
前缀
非常感谢,
Robin这是因为bash有一种兼容模式,如果它是通过名称
sh
启动的,它会尝试模拟sh
,如主页所示:
如果使用名称sh调用bash,它将尝试模拟启动
尽可能接近sh的历史版本的行为,而
也符合POSIX标准。当作为
交互式登录shell,或带有--login的非交互式shell
选项,它首先尝试从中读取和执行命令
/etc/profile和~/.profile,按顺序排列。--noprofile选项
可以用来抑制这种行为。当作为交互函数调用时
名为sh,bash的shell查找变量ENV,展开其
值(如果已定义),并使用扩展值作为
要读取和执行的文件。因为作为sh调用的shell不会
尝试从任何其他启动文件读取和执行命令
--rcfile选项无效。使用名称sh调用的非交互式shell不会尝试读取任何其他启动文件。什么时候
作为sh调用,bash在启动文件完成后进入posix模式
阅读