我正在尝试构建一个Docker映像,但是它失败了,因为我尝试使用apt install
获取的一个软件包会在安装过程中提示用户。我想回复此提示,但我不知道如何非交互地进行操作。
我正在构建Docker映像,并且Dockerfile包含以下行:
RUN apt install -y texlive-latex-extra
(此软件包中有一些我需要的LaTeX库。)
在安装过程中,此操作将暂停:
Setting up tzdata (2018d-1) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
Configuring tzdata
------------------
Please select the geographic area in which you live. Subsequent configuration
questions will narrow this down by presenting a list of cities, representing
the time zones in which they are located.
1. Africa 6. Asia 11. System V timezones
2. America 7. Atlantic Ocean 12. US
3. Antarctica 8. Europe 13. None of the above
4. Australia 9. Indian Ocean
5. Arctic Ocean 10. Pacific Ocean
Geographic area:
这时,它正在等待输入。 (此后还有另一个提示,用于选择时区-我认为这对于LaTeX文件中的\today
指令很重要。\\((ツ)_ /¯)
我该如何非交互地回答此问题?
我尝试这样做:
apt install -y texlive-latex-extra <(echo 12 && echo 2)
这:
echo 12 && echo 2 | apt install -y texlive-latex-extra
第一个死于此错误:
apt install -y texlive-latex-extra <(echo 12 && echo 9)
第二个似乎没有效果。
作为参考,这是到目前为止的Dockerfile:
FROM ubuntu:latest
RUN apt update && apt upgrade -y && apt install -y curl bzip2 tar make gcc wget gnupg unzip
RUN apt install -y texlive
RUN apt install -y nodejs npm git
RUN npm install -g bower
RUN apt install -y texlive-latex-extra
我发现here接近,建议在apt install
上运行DEBIAN_FRONTEND=noninteractive
。这充分解决了我的问题。 :)但是,我仍然想知道如何响应提示,因为那里提供的解决方案仅提供了如何抑制提示。
答案 0 :(得分:3)
如果要编写终端交互的脚本,可以在Linux上使用expect(这可能并不容易;您需要预测交互)。
请记住,terminal emulators是复杂且不可思议的事情(因为terminals之类的VT100很复杂)。参见termios(3),pty(7)并阅读The Tty demystified。