【发布时间】:2016-01-13 06:12:51
【问题描述】:
我有一些脚本需要在 Docker 构建期间运行,它需要一个 tty(Docker 在构建期间不提供)。在后台,脚本使用read 命令。 有了一个tty,我可以做(echo yes; echo no) | myscript.sh之类的事情。
没有它,我会收到一些我不完全理解的奇怪错误。那么有什么方法可以在构建过程中使用这个脚本(鉴于它不是我的修改?)
编辑:这是一个更明确的错误示例:
FROM ubuntu:14.04
RUN echo yes | read
失败:
Step 0 : FROM ubuntu:14.04
---> 826544226fdc
Step 1 : RUN echo yes | read
---> Running in 4d49fd03b38b
/bin/sh: 1: read: arg count
The command '/bin/sh -c echo yes | read' returned a non-zero code: 2
【问题讨论】:
-
您确定没有 tty 是问题所在吗?根据this answer,“read: arg count”错误是由于 /bin/sh 中的 read 内置函数需要一个参数(存储标准输入回复的变量)而 /bin/bash 不需要(它使用$REPLY 作为默认值)。
-
我发布了赏金,为了赢得它,我正在寻找手头问题的解决方案,而不是“你不需要那个”的答案。我知道原始问题“可以”在没有 tty 的情况下解决,我想知道它是否可以根据问题“使用”tty 来解决。如果我们都可以假设 OP 发布了一个虚拟问题来演示该问题,而不是对于这个论坛来说太长的真正复杂的实际问题,那么我们都会相处得很好。我知道如何解决我遇到的特定 sudo 问题,但我仍然需要一个 tty 来处理其他事情,例如当执行到正在运行的容器中时......
-
@EngineerDollery 你有没有在构建 Dockerfile 期间需要 TTY 的示例?
docker exec不是这样的示例,因为您没有进行构建,并且您在该命令上有-t选项。目前,构建的答案是它不是一种选择,也没有人提供一个例子来证明它甚至是需要的。 -
Sudo 就是一个很好的例子。在我这里,我们使用 ansible 来配置机器,包括 docker 映像,并且由于我们必须对所有机器使用相同的脚本,因此我们不允许将任何 docker 特定的东西放在那里,所以我 yum install ansible 并运行在再次卸载 ansible 之前适当的剧本(ssh 是不可能的)。 Ansible 使用 sudo,而 sudo 被破坏(至少在 centos 上)因为它需要 tty(这是一个众所周知的错误)。
-
如果一切都失败了,请调查
expect。
标签: linux docker tty dockerfile