如何在 Docker 构建期间运行需要 tty 的命令?

2023-11-23

我有一些需要在 Docker 构建期间运行的脚本,该脚本需要 tty(Docker 在构建期间不提供)。在幕后该脚本使用read命令。Witha 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

RUN <command> in Dockerfile参考:

shell 形式,命令在 shell 中运行,默认情况下在 Linux 上为 /bin/sh -c 或在 Windows 上为 cmd /S /C

让我们看看到底是什么/bin/sh位于 ubuntu:14.04:

$ docker run -it --rm ubuntu:14.04 bash
root@7bdcaf403396:/# ls -n /bin/sh
lrwxrwxrwx 1 0 0 4 Feb 19  2014 /bin/sh -> dash

/bin/sh 是一个符号链接dash, see read函数于dash:

$ man dash
...
read [-p prompt] [-r] variable [...]
            The prompt is printed if the -p option is specified and the standard input is a terminal.  Then a line
            is read from the standard input.  The trailing newline is deleted from the line and the line is split as
            described in the section on word splitting above, and the pieces are assigned to the variables in order.
            At least one variable must be specified.  If there are more pieces than variables, the remaining pieces
            (along with the characters in IFS that separated them) are assigned to the last variable.  If there are
            more variables than pieces, the remaining variables are assigned the null string.  The read builtin will
            indicate success unless EOF is encountered on input, in which case failure is returned.

            By default, unless the -r option is specified, the backslash ``\'' acts as an escape character, causing
            the following character to be treated literally.  If a backslash is followed by a newline, the backslash
            and the newline will be deleted.
...

read函数于dash:

必须至少指定一个变量。

让我们来看看read函数于bash:

$ man bash
...
read  [-ers]  [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name...]
If  no names are supplied, the line read is assigned to the variable REPLY.  The return code is zero,
              unless end-of-file is encountered, read times out (in which case the  return  code  is  greater  than
              128), or an invalid file descriptor is supplied as the argument to -u.
...

所以我猜你的剧本myscript.sh是开始于#!/bin/bash或其他但不是/bin/sh.

此外,您还可以更改您的Dockerfile像下面这样:

FROM ubuntu:14.04
RUN echo yes | read ENV_NAME

Links:

  • https://docs.docker.com/engine/reference/builder/
  • http://linux.die.net/man/1/dash
  • http://linux.die.net/man/1/bash
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Docker 构建期间运行需要 tty 的命令? 的相关文章

随机推荐

  • Dojo AMD:无法在 require 中调用函数

    我确实是 dojo 的新手 但当我开始使用 dojo 版本 1 7 2 开发新应用程序时 我也想使用新的 AMD 函数语法 不幸的是我似乎不明白 最让我烦恼的是我不能简单地调用 require 块内的任何函数 例如 我有一个页面 打开时会创
  • 按下后退按钮时如何保留可滚动区域的滚动位置?

    我在一个大的可滚动 div 中有一长串链接 每次当用户单击链接然后单击后退按钮时 它都会从 div 的最顶部开始 这对我们的用户来说并不友好 有什么方法可以让浏览器在按后退按钮时滚动到上一个位置 非常感谢 在页面卸载期间 获取滚动位置并将其
  • pyplot:以 e 为基数的 loglog()

    Python 和 matplotlib 新手是从 R 过来的 所以我希望这个问题不是太白痴 我正在尝试在自然对数刻度上绘制对数对数图 但经过一番谷歌搜索后 我无法弄清楚如何强制 pyplot 在轴上使用基本 e 刻度 我目前拥有的代码 im
  • 在 Tensorflow 中使用字符串标签

    我仍在尝试使用自己的图像数据运行 Tensorflow 我能够使用此示例中的conevert to 函数创建一个 tfrecords文件link 现在我想用该示例中的代码来训练网络link 但在 read and decode 函数中失败
  • 如何序列化第三方不可序列化的最终类(例如google的LatLng类)?

    我在用着Google 的 LatLng 类来自 v2 Google Play 服务 该特定类是最终类 未实现java io Serializable 有什么办法可以做到吗LatLng类工具Serializable public class
  • 如何在静态库中存储版本号?

    如何将版本号存储在静态库 file a 中 然后在 Linux 中检查其版本 附 我需要能够随时检查文件的版本 而无需仅使用 shell 实用程序使用任何特殊的可执行文件 除了提供 Puppe 提到的静态字符串之外 通常的做法是提供一个宏来
  • 齐射请求的匿名侦听器导致内存泄漏

    我正在使用 volley 库进行网络服务调用 我创建了一个通用类来进行所有 Web 服务调用并从那里进行服务调用 并为成功和错误响应创建了匿名侦听器 但是当我使用泄漏金丝雀时 它显示与上下文相关的内存泄漏 下面是我的代码片段 public
  • Hive 中的“InputFormat、OutputFormat”和“Stored as”有什么区别?

    我是大数据新手 目前正在学习 Hive 我理解 Hive 中的 InputFormat 和 OutputFormat 的概念是 SerDe 的一部分 我还了解到 存储为 用于以特定格式存储文件 就像 InputFormat 一样 但我不明白
  • C++ 算术运算符

    刚刚在技术面试中被问到了一个让我有点困惑的问题 问题如下 If int i 1 int j 1 and int k 1 我们运行以下行 i j k i j 和 k 的新值是多少 我感到困惑的原因是 由于我们没有将此表达式分配给任何东西 因此
  • 在 Android 视图中使用 UI 元素进行测试

    我正在尝试使用以下测试用例测试简单的 UI 主要思想是在测试中设置一些 UI 文本 以模拟用户输入 然后主动单击事件 public class StackTestCase extends ActivityInstrumentationTes
  • 如何阻止 Chrome 和 Opera 按索引 ASC 对 JSON 对象进行排序?

    我有一个问题 使用 ajax 我使用以下命令发送了格式正确的 JSON 对象 ajax type POST url SITE URL data php dataType json data ajax 1 success function d
  • Hadoop Streaming:映射器“包装”二进制可执行文件

    我有一个管道 目前在大型大学计算机集群上运行 出于发布目的 我想将其转换为 mapreduce 格式 以便任何使用 amazon webservices AWS 等 hadoop 集群的人都可以运行它 该管道当前由一系列 python 脚本
  • 如何将 python.h 放入 Mac OSX 上的 python virtualenv 中?

    我正在为 python 应用程序编写 C 扩展 并且需要测试特定于 python 的 C 代码 为此 我需要将 Python h 导入到我的 C 文件中 但我一生都无法做到这一点 大多数教程都建议使用 sudo apt get python
  • 比较2个不同pandas数据帧的2列,如果相同则在Python中插入1到另一个

    我有一个带有日期时间 电压数据的熊猫数据框 如下所示 df1 Date Time Chan 0 20130401 9 00 AAT 1 20130401 10 00 AAT 2 20130401 11 00 AAT 3 20130401 1
  • PL/SQL 可选,其中 [重复]

    这个问题在这里已经有答案了 嘿 我在 PL SQL 中有这个查询 Ver todos los atributos de las OL de una OS SELECT attr swspattrdataid attr data id att
  • 阻止执行特定的内联脚本标记

    我正在尝试编写一个脚本捣固猴阻止执行特定的内联脚本标记 页面正文看起来像这样
  • 如何根据一组图像编写电影创作脚本?

    我设法使用 Python 加载了一组图像 我希望我的脚本能够拍摄这一系列图像 以我需要的任何格式 并根据它们创建视频 所有这一切的最大限制是我正在寻找易于安装的东西 理想情况下 使用标准 OS X 安装过程 下载 dmg click 移至应
  • 在spark中,如何快速估计数据框中的元素数量

    在spark中 有没有一种快速的方法来获取数据集中元素数量的近似计数 也就是说 比Dataset count does 也许我们可以根据数据集的分区数量来计算这些信息 可以吗 你可以尝试使用countApprox在 RDD API 上 尽管
  • 如何重写此 Flask 视图函数以遵循 post/redirect/get 模式?

    我有一个小型日志浏览器 它根据用户的输入检索并显示以前记录的记录列表 它不更新任何内容 代码非常简单并且运行良好 这是一个简化版本 app route log methods GET POST def log form LogForm if
  • 如何在 Docker 构建期间运行需要 tty 的命令?

    我有一些需要在 Docker 构建期间运行的脚本 该脚本需要 tty Docker 在构建期间不提供 在幕后该脚本使用read命令 Witha tty 我可以做类似的事情 echo yes echo no myscript sh 没有它 我