Docker RUN指令以获取bash配置文件

时间:2019-04-12 13:28:43

标签: docker

我通过docker运行了一些安装脚本,它们更改了〜/ .bashrc,但是我需要在下面的RUN指令中提供源代码以使用已安装的命令。

尝试了明显的RUN . ~/.bashrc并收到了/bin/sh: 13: /root/.bashrc: shopt: not found错误。

尝试RUN . ~/.profile并获得mesg: ttyname failed: Inappropriate ioctl for device

我不想使用ENV说明。拥有外部安装脚本的目的是在非Docker环境中使用它们,例如,在本地运行单元测试时。 ENV说明会重复安装脚本中已经完成的环境设置。

1 个答案:

答案 0 :(得分:0)

您不应尝试在Docker中设置外壳点文件。许多典型路径根本无法运行它们;例如

# In a Dockerfile
CMD ["some", "command", "here"]

# From the command line
docker run myimage some command here

从根本上说,Docker环境不同于独立的Linux系统。除了外壳点文件外,“主目录”实际上不是Docker的概念,如果您有一个多部分的进程,则在Docker上标准是将每个部分运行在单独的容器中,但是在独立Linux上,您可以使用init系统,使所有零件一起运行。如果您希望事情在完全相同的安装脚本下可以完全相同,那么虚拟机将是您尝试中的更好的技术匹配。

(“设备的不适当的ioctl”还表明,dotfile中有些东西强烈希望从实际终端运行,而您在docker build时不一定有这些东西。)

我在这里的一般建议是:

  1. 如果可能,请在映像的“系统”目录中安装内容,并避免需要自定义环境变量设置。 (不要使用nvm或rvm之类的版本管理器;不要使用Python虚拟环境。)
  2. 如果必须设置环境变量,可以使用ENV
  3. 如果您确实不能执行上述任一操作,则可以在启动主进程之前在ENTRYPOINT脚本中设置环境变量;但是如果对您来说很重要的是,变量将显示在docker inspectdocker exec shell中,则不会在其中设置它们。

(还请记住,每个RUN命令都会使用全新的shell环境启动一个新容器。您可以RUN . .profile; foo,但是环境变量设置不会传递到下一个{{1} }行。)