如何在DockerFile中使用bash而非sh命令?bash别名对sh shell是否生效?
容器化Python Hello World程序的Dockerfile及疑问解答
Hey,我来帮你整理下这份Dockerfile,同时解答你提到的两个Docker相关的技术问题:
首先是你提供的Dockerfile内容(注意最后一行RUN ec...看起来是输入截断了,我先原样保留):
FROM ubuntu:16.04 MAINTAINER Bhavani Ravi RUN apt-get update RUN apt-get install -y software-properties-common vim RUN add-apt-repository ppa:jonathonf/python-3.6 RUN apt-get update RUN apt-get install -y build-essential python3.6 python3.6-dev python3-pip python3.6-venv RUN apt-get install -y git # update pip RUN python3.6 -m pip install pip --upgrade RUN python3.6 -m pip install wheel RUN ec...
疑问1:如何在Dockerfile中使用bash而非sh命令?
有两种实用的方法可以实现:
单命令指定bash执行:如果只是某几个命令需要用bash,直接在RUN里显式调用bash来执行命令串即可,比如:
RUN bash -c "source ~/.bashrc && echo 'Using bash features'"这种方式灵活,适合只需要偶尔切换shell的场景。
全局设置默认SHELL:如果希望整个Dockerfile里的RUN、CMD、ENTRYPOINT都默认用bash运行,可以在FROM指令之后添加SHELL配置:
FROM ubuntu:16.04 SHELL ["/bin/bash", "-c"] MAINTAINER Bhavani Ravi # 后续所有RUN命令都会默认通过bash执行 RUN apt-get update ...这样设置后,你就能直接使用bash的高级特性,比如更丰富的变量扩展、数组支持等,不用每次都手动指定bash。
疑问2:bash别名对sh shell是否生效?
明确说:完全不生效,原因主要有两个:
- 别名是bash专属的功能,而大多数Linux发行版里的
sh其实是dash(一种轻量级的POSIX标准shell),它本身就不支持bash的别名语法。 - 就算你在bash环境里定义了别名,当切换到sh时,sh不会加载bash的配置文件(比如
.bashrc、.bash_profile),所以之前定义的别名根本不会被sh识别。
如果需要在sh环境中实现类似别名的快捷调用,推荐用shell函数或者创建命令软链接:
# 用函数替代别名,sh也支持函数 my_pip() { python3.6 -m pip "$@" }
内容的提问来源于stack exchange,提问作者Bhavani Ravi
相关产品推荐
相关产品推荐

