【问题标题】:how to reload .bashrc in dockerfile如何在 dockerfile 中重新加载 .bashrc
【发布时间】:2018-06-09 19:58:16
【问题描述】:

我在 Dockerfile 中的 .bashrc 中添加了许多东西,这是执行我稍后要在 Dockerfile 中运行的一些命令所必需的,
我累了source .bashrc,这不起作用。
我尝试使用RUN /bin/bash -c --login ...,但出现错误:mesg: ttyname failed: inappropriate ioctl for device

【问题讨论】:

  • 这非常不清楚。也许一开始edit 你的问题是为了展示你的实际Dockerfile 并解释你想要完成的事情。首先,向.bashrc 添加内容的要求听起来非常可疑。
  • 我正在使用 ROS,为了设置依赖项,我为 bashrc 的依赖项添加了不同的路径,包括 opencv 库路径。
  • wiki.ros.org/ROS/Tutorials/… 建议在您的 .bashrc 中添加一个 source 行,并将依赖项保存在外部文件中。那会更有意义。

标签: bash docker dockerfile


【解决方案1】:

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指出in the comments

在我的例子中,它是 for nvm:它向 .bashrc 添加了一个 init 脚本,因此它在 Dockerfile 上下文中不可用。
最后用它的依赖命令制作了一个安装脚本。

【讨论】:

  • 虽然这一切都是正确和真实的,但这个问题看起来像一个巨大的XY problem。我发现很难想象你真正需要这个的情况。
  • @tripleee 我来到这里寻找一种方法来加载必须动态设置的 Java $CLASSPATH 变量(即既不能使用 ENV 也不能使用 ARG 的情况,并且在其中写入所需的 CLASSPATH 值到 .bashrc 是一种解决方法)
  • @SigmaX 好点。我的回答有用吗? (因为我在stackoverflow.com/posts/50780759/timeline 中没有看到任何最近的支持)
  • @VonC 抱歉,我没有尝试——我最终决定,如果我要编写额外的脚本,我可以在脚本中临时设置导出 CLASSPATH(不担心.bashrc)。
  • 在我的情况下,它是为nvm 添加一个初始化脚本到.bashrc,因此它在 Dockerfile 上下文中不可用。最后用它的依赖命令制作了一个安装脚本
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 2015-02-26
  • 2011-01-31
  • 1970-01-01
  • 2012-04-06
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多