我正在创建一个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确实可以运行...
答案 0 :(得分:1)
第一;感谢@chepner向我解释了为什么/ etc / bashrc无法运行。所以我想出了一个不错的解决方法:
/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
如果没有安装主目录,现在会创建一个无限循环。