为什么我的(centos)docker容器不能运行/ etc / bashrc?

时间:2019-01-29 16:27:44

标签: bash docker

我正在创建一个Docker映像,我想在其中装载主目录。但是,还有一些我想在实例化时运行的其他bashrc文件。

问题是我无法将此bashrc文件复制到用户的工作目录中,因为这是我要挂载(主机)主目录的位置。因此,我尝试将其追加到/etc/bashrc或放入/etc/profile.d中,但它永远无法运行。

我的dockerfile看起来像这样:

FROM centos:7

RUN adduser -s /bin/bash user -G users
RUN echo "echo /etc/bashrc" >> /etc/bashrc
RUN echo "echo /etc/profile" >> /etc/profile
RUN echo "echo /etc/profile.d/mine.sh" >> /etc/profile.d/mine.sh

USER user
WORKDIR /home/user
ENTRYPOINT [ "/bin/bash" ]

我现在在安装主目录时构建并运行此容器:

docker build -t devenv .
docker run --rm --volume $HOME:/home/user -it devenv

当我打开控制台时,仅(挂载的).bashrc运行。但是,如果我运行bash -l(登录shell);然后运行配置文件(但不运行.bashrc)。

bash-4.2$ bash
inside mounted host .bashrc
bash-4.2$ bash -l
/etc/profile.d/mine.sh
/etc/profile
/etc/profile.d/mine.sh
/etc/profile

所以我不知道在进入控制台时将要运行的逻辑放在哪里(并且.bashrc也应该运行)? / etc / bashrc为什么不运行?

EDIT :在centos7虚拟机中运行bash甚至bash -l时; / etc / bashrc确实可以运行...

1 个答案:

答案 0 :(得分:1)

第一;感谢@chepner向我解释了为什么/ etc / bashrc无法运行。所以我想出了一个不错的解决方法:

  • 强制bash在启动时加载/etc/bashrc
  • /etc/bashrc内部;添加我的特定配置,然后运行~/.bashrc

Dockerfile:

FROM centos:7

RUN adduser -s /bin/bash user -G users
# remove /home/user/.bashrc to avoid infinite loop with /etc/bashrc
# when /home/user is not mounted
RUN rm /home/user/.bashrc
RUN echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> /etc/bashrc
RUN echo "echo /etc/bashrc" >> /etc/bashrc
RUN echo "echo /etc/profile" >> /etc/profile
RUN echo "echo /etc/profile.d/mine.sh" >> /etc/profile.d/mine.sh

USER user
WORKDIR /home/user
ENTRYPOINT [ "/bin/bash", "--rcfile", "/etc/bashrc" ]

再次构建并运行该输出:

/etc/profile.d/mine.sh
/etc/bashrc
inside mounted host .bashrc
inside bashrc

注意:请确保在您的Docker映像中删除原始的.bashrc。 〜/ .bashrc中centos:7的默认内容是:

if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

如果没有安装主目录,现在会创建一个无限循环。