cha*_*had 3 linux ubuntu oracle11g docker
我开始使用安装了OracleXE的Docker镜像.此映像具有正在运行的实例,并配置了所有内容.
我可以启动该图像,并且,无论是从交互式shell容器,还是通过ssh进入容器,我都可以轻松执行sqlplus
.
要创建一个带有我想要的添加项的容器,比如新的oracle用户和表空间,我可以进入运行容器并执行必要的操作sqlplus
,然后docker commit
使用我的新状态执行新映像.但是,我想在a中捕获这些新变化Dockerfile
.
但是...当我的Dockerfile尝试执行上面引用的相同命令时,PATH
它没有上面的ORACLE_HOME
内容; 当我进入带有SSH
交互式外壳的容器时,它显然会这样做.
注意,链接到上面的原始Dockerfile使用以下命令设置PATH.
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
Run Code Online (Sandbox Code Playgroud)
执行RUN命令时以及通过交互式shell或SSH进入容器时,环境之间的区别是什么?请注意,这一切都以ubuntu 14.04映像开头.
当您以交互方式运行时,shell将执行其rcfiles:
当Bash作为交互式登录shell或具有--login选项的非交互式shell 调用时,它首先从文件/ etc/profile中读取并执行命令(如果该文件存在).在读取该文件之后,它按顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令.
在构建Dockerfile时,它正在运行非交互式shell:
例如,当以非交互方式启动Bash以运行shell脚本时,它会在环境中查找变量BASH_ENV,如果它出现在那里则展开其值,并使用扩展值作为文件名来读取和执行.
Run Code Online (Sandbox Code Playgroud)if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi`
你可以设置BASH_ENV
让事情运行.或者在Dockerfile的每一行上使用RUN bash --login <command>
或RUN . /etc/bash.bashrc && <command>
.但这非常糟糕.
我会使用ENV
dockerfile命令来设置这些变量.我不确定为什么原版会按照它的方式设置它们.