Dockerfile RUN中的环境与正在运行的容器上的交互式shell之间的区别?

时间:2015-03-12 22:44:16

标签: linux ubuntu oracle11g docker

我从Docker image that has OracleXE installed on it开始。此图像具有正在运行的实例,并配置了所有内容 我可以启动该图像,并且,无论是从交互式shell容器,还是通过ssh进入容器,我都可以轻松执行sqlplus

要创建一个包含我想要的添加项的容器,例如新的oracle用户和表空间,我可以进入正在运行的容器并执行必要的sqlplus,然后docker commit使用我的Dockerfile新图像新国家。但是,我想在PATH中捕获这些新变化。

但是。 ..当我的Dockerfile尝试执行上面引用的相同命令时,ORACLE_HOME上没有SSH;当我使用RUN echo 'export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe' >> /etc/bash.bashrc RUN echo 'export PATH=$ORACLE_HOME/bin:$PATH' >> /etc/bash.bashrc RUN echo 'export ORACLE_SID=XE' >> /etc/bash.bashrc 或交互式shell进入容器时,显然会这样做。

注意,链接到上面的原始Dockerfile使用以下命令设置PATH。

{{1}}

RUN命令执行时和通过交互式shell或SSH进入容器时的环境有什么区别?请注意,这一切都以ubuntu 14.04映像开头。

1 个答案:

答案 0 :(得分:5)

请参阅Bash manual entry on startup files

当您以交互方式运行时,shell将执行其rcfiles:

  

当Bash被调用为交互式登录shell 时,或者作为带有--login选项的非交互式shell时,它首先从文件/ etc / profile中读取并执行命令,如果是文件已存在。读取该文件后,它会按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取和执行命令。

当你的Dockerfile正在构建时,它正在运行一个非交互式shell:

  

当以非交互方式启动Bash时,要运行shell脚本,例如,它会在环境中查找变量BASH_ENV,如果它出现在那里会扩展其值,并使用扩展值作为要读取和执行的文件的名称。

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi`

可以设置BASH_ENV来运行。或者在Dockerfile的每一行使用RUN bash --login <command>RUN . /etc/bash.bashrc && <command>。但这非常糟糕。

我会使用ENV dockerfile命令来设置这些变量。我不确定为什么原版会按照它的方式设置它们。