如何在 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 的命令? 的相关文章

  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • 如何检查docker中当前/默认的日志驱动程序?

    我正在尝试检查已停止的 docker 容器的日志 但是当我这样做时docker logs
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • Docker Hub API v2 令牌身份验证问题

    目前 我正在开发一个非常轻量级版本的 Docker 容器编排器 并且我必须能够从公共 Docker Hub 注册表获取图像摘要 我想使用 Docker Registry API v2 来实现此目的 我正在尝试使用以下 API 调用获取授权令
  • 应用程序移至 Docker 生产环境时 Flask-WTF CSRF 验证失败

    我刚刚为我一直在开发的 Flask 应用程序设置了生产环境 这个堆栈是 Windows Server 2012 R2 Hyper V VM Running Ubuntu 14 04 Docker 1 5 Running Containers
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • 带有 npm 启动脚本的 Nodejs 应用程序

    我对nodejs很陌生 在我的docker化环境中 我想为nodejs应用程序提供appdynamics支持 这要求每个应用程序都要求将以下内容作为其应用程序的第一行 require appdynamics profile controll
  • 如何从 Docker Hub 删除存储库

    如何从 Docker Hub 完全删除存储库 Docker 正在快速发展 他们的网站也是如此 这是从 docker hub Web 界面删除存储库的最新方法 首先 确保您已登录 hub docker com Simple 单击顶部的存储库链
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh

随机推荐

  • 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 没有它 我