我通过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说明会重复安装脚本中已经完成的环境设置。
答案 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
时不一定有这些东西。)
我在这里的一般建议是:
ENV
。ENTRYPOINT
脚本中设置环境变量;但是如果对您来说很重要的是,变量将显示在docker inspect
或docker exec
shell中,则不会在其中设置它们。(还请记住,每个RUN
命令都会使用全新的shell环境启动一个新容器。您可以RUN . .profile; foo
,但是环境变量设置不会传递到下一个{{1} }行。)