如何在Dockerfile中重新加载.bashrc文件

10

我正在Dockerfile中添加许多东西到.bashrc,这是后面要运行的一些命令必须要有的,
我尝试了source .bashrc但它并不能起作用。
我尝试使用RUN /bin/bash -c --login ... 但是我遇到了一个错误:mesg:ttyname失败:设备不当的ioctl


1
这个表述非常不清楚。也许首先[编辑]你的问题,展示你实际的Dockerfile并解释你想要完成什么。在.bashrc中添加东西的要求本身就非常可疑。 - tripleee
我正在使用ROS,为了设置依赖项,我将不同的依赖路径添加到bashrc中,包括opencv库路径。 - sam
http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment 建议在您的.bashrc文件中添加一行source,并将依赖项保存在外部文件中。这样做更加合理。 - tripleee
1个回答

11

Dockerfile中的每个命令都会创建一个新的临时容器,但没有tty(issue 1870,在PR 4955中讨论,但因PR 4882而关闭)。

在docker构建期间缺少tty会触发ttyname failed: inappropriate ioctl for device错误消息。

相反,您可以尝试运行一个包装器脚本,在其中将源代码.bashrc

Dockerfile

COPY myscript /path/to/myscript
RUN /path/to/myscript

myscript:

#!/bin/bash
source /path/to/.bashrc
# rest of the commands    

Abderrahim指出在评论中

在我的情况下,这是对于nvm而言:它会向.bashrc添加一个init脚本,因此在Dockerfile环境中无法使用。
最终使用其依赖命令编写了安装脚本。


1
虽然这一切都是正确和真实的,但问题看起来像一个庞大的XY问题。我很难想象一个你真正需要这个的情况。 - tripleee
1
@tripleee 我来到这里是为了寻找一种动态设置Java $CLASSPATH变量的方法(即在无法使用ENV或ARG的情况下,将所需的CLASSPATH值写入.bashrc是一种解决方法)。 - SigmaX
@VonC 抱歉,我没有尝试过 - 我最终决定,如果我要编写额外的脚本,我可以在脚本中临时设置导出CLASSPATH(而不必担心.bashrc)。 - SigmaX
2
在我的情况下,是为了 nvm 它会向 .bashrc 添加一个 init 脚本,因此它在 Dockerfile 上下文中无法使用。最终我编写了一个安装脚本,并添加了其依赖命令。 - Abderrahim
@Abderrahim,感谢您的反馈。我已将您的评论包含在答案中以增加其可见性。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接