我想自动加载一个CentOS码头容器中的模块。
通常,我会将命令放在.bashrc / .bash_profile中,但我似乎无法让它工作。
下面是我当前Dockerfile的开始:
FROM centos:7.6.1810
RUN yum update -y && yum clean all
RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm \
&& yum install -y python36u python36u-libs python36u-devel python36u-pip \
&& yum install -y environment-modules mpich mpich-devel gcc-c++ \
&& yum install -y git
RUN echo "source /usr/share/Modules/init/bash" >> /root/.bash_profile \
&& echo "module load mpi/mpich-x86_64" >> /root/.bash_profile \
&& update-alternatives --install /usr/bin/python python /usr/bin/python2 50 \
&& update-alternatives --install /usr/bin/python python /usr/bin/python3.6 60
WORKDIR /app
...这是一个有效的命令:
docker run -t my_image:tag /bin/bash -c "source /usr/share/Modules/init/bash; module load mpi/mpich-x86_64; mpiexec"但我只想让docker run -t my_image:tag /bin/bash -c "mpiexec"工作。
我尝试过在例如/root/.bashrc或/app/.bash_profile中添加许多回显命令的组合,但似乎无法使其工作。
发布于 2019-08-22 05:50:04
在您描述的docker run命令中,bash是以非交互模式作为非登录shell启动的。在这种情况下,bash不计算它的初始化配置文件,比如~/.bash_profile或~/.bashrc。
为了适应此上下文中的bash初始化,可以使用BASH_ENV变量。在非交互模式下启动时,如果设置了该变量,bash将来源于该变量所指向的文件。
因此,我建议将您的码头形象的定义修改如下:
~/.bashenv文件,以保存mpi模块文件的环境模块初始化命令和加载。BASH_ENV变量,指向图像定义中的/root/.bashenv,以便在创建的容器上运行命令时设置它。FROM centos:7.6.1810
RUN yum update -y && yum clean all
RUN yum install -y https://centos7.iuscommunity.org/ius-release.rpm \
&& yum install -y python36u python36u-libs python36u-devel python36u-pip \
&& yum install -y environment-modules mpich mpich-devel gcc-c++ \
&& yum install -y git
&& update-alternatives --install /usr/bin/python python /usr/bin/python2 50 \
&& update-alternatives --install /usr/bin/python python /usr/bin/python3.6 60 \
&& echo "source /usr/share/Modules/init/bash" >> /root/.bashenv \
&& echo "module load mpi/mpich-x86_64" >> /root/.bashenv \
&& echo "[[ -s ~/.bashenv ]] && source ~/.bashenv" >> /root/.bash_profile \
&& echo "[[ -s ~/.bashenv ]] && source ~/.bashenv" >> /root/.bashrc
ENV BASH_ENV=/root/.bashenv
WORKDIR /apphttps://stackoverflow.com/questions/57580395
复制相似问题