2017-10-19 304 views
2

我在创建没有设置环境变量的容器时遇到了问题,我知道在图像定义中设置了该容器。在Docker中设置环境变量

我已经创建了一个Dockerfile来生成OpenSuse 42.3的映像。我需要在图像中设置一些环境变量,以便任何从图像启动容器的人都可以使用我编译并放置在图像中的代码。

我创建了一个名为“image_env_setup.sh”的shell文件,其中包含必要的环境变量定义。我还手动将这些环境变量定义添加到Dockerfile。

USER codeUser 
COPY ./docker/image_env_setup.sh /opt/MyCode 

ENV PATH="$PATH":"/opt/MyCode/bin:/usr/lib64/mpi/gcc/openmpi/bin" 
ENV LD_LIBRARY_PATH="/usr/lib64:/opt/MyCode/lib:" 
ENV PS1="[\[email protected]: \w]\$ " 
ENV TERM="xterm-256color" 
ENV GREP_OPTIONS="--color=auto" 
ENV EDITOR=/usr/bin/vim 

USER root 
RUN chmod +x /opt/MyCode/image_env_setup.sh 
USER codeUser 
RUN /opt/MyCode/image_env_setup.sh 
RUN /bin/bash -c "source /opt/MyCode/image_env_setup.sh" 

,我用它来创建容器的命令是:

docker run -it -d --name ${containerName} -u $userID:$groupID   \ 
      -e USER=$USER --workdir="/home/codeUser"   \ 
      --volume="${home}:/home/codeUser" ${imageName} /bin/bash \ 

唯一可行的就是通过再次运行shell文件当容器启动。

docker start $MyImageTag 
docker exec -it $MyImageTag /bin/bash --rcfile /opt/MyCode/image_env_setup.sh 

我不认为在容器中设置shell变量会很困难,因此任何进入它的条目都会为用户提供已定义的内容。

+1

'alias'是一个外壳命令;它与'ENV'修改的环境无关。 – chepner

+0

谢谢@chepner。我编辑了它。对我来说最重要的部分是正确设置PATH和LD_LIBRARY_PATH环境变量。其他东西只是用户在进入容器时看到的显示内容的美学内容。 – wandadars

回答

2

RUN项不能修改环境变量(我假设你想在image_env_setup.sh中设置更多变量)。 Dockerfile中只有ENV条目(和像--rcfile这样的docker选项可以更改环境)。

当然,您也可以决定从.bashrc来源image_env_setup.sh

例如,既可以预先制作.bashrc并用COPY拉它,或做

RUN echo '. /opt/MyCode/image_env_setup.sh' >> ~/.bashrc 
+0

我明白了。大部分在image_env_setup.sh文件中设置的变量都在Dockerfile示例中。 我该如何去寻找从.bashrc中获取image_env_setup.sh?这会发生在哪里(Dockerfile,码头运行命令等)? – wandadars

+1

查看我的编辑,@wandadars – AnoE

+0

我看到@AnoE,但是>> .bashrc命令隐含的目录是什么?看起来像是假定我所在的任何目录都是.bashrc文件。这通常出现在“/ home/codeUser”目录中? 我将主机的主目录挂载到容器的主目录,这意味着.bashrc文件是主机上的.bashrc文件。我是否应该将主机的主目录安装在容器家的子目录中? – wandadars

0

你可以把/opt/MyCode/image_env_setup.sh在〜/ .bash_profile中或容器的〜/ .bashrc,这样每次你进入容器你有env的设置