在Docker容器中安装Certbot时,避免与tzdata进行用户交互。

我想在一个使用Ubuntu 16.04镜像的Docker环境中安装certbot
例如:
docker run -it ubuntu:16.04 /bin/bash

当我在容器内部时,安装Certbot的最直接方法无法使用,因为它需要用户干预。
apt-get update && \
apt-get install -y software-properties-common && \
add-apt-repository -y -u ppa:certbot/certbot && \
apt-get install -y certbot

问题出在tzdata上,它会停下来并弹出这个交互式的对话框:
Extracting templates from packages: 100%
Preconfiguring packages ...
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      4. Australia  7. Atlantic  10. Pacific  13. Etc
 2. America     5. Arctic     8. Europe    11. SystemV
 3. Antarctica  6. Asia       9. Indian    12. US
Geographic area: 

很奇怪,当我在添加ppa之前安装tzdata时,它就能正常工作。
apt-get update && \
apt-get install -y tzdata && \
apt-get install -y software-properties-common && \
add-apt-repository -y -u ppa:certbot/certbot && \
apt-get install -y certbot

问题:
- 在添加ppa之前或之后安装tzdata有什么区别? - 是否有更好的方法来避免在安装certbot时出现交互对话框?

6可能是一个重复的问题,在命令行中安装带有参数提示的软件包 - David Foerster
5个回答

要在不进行交互对话的情况下运行dpkg(在其他工具如Apt之后),您可以设置一个环境变量为

DEBIAN_FRONTEND=noninteractive

例如,您可以在Dockerfile中使用ARG进行设置。
ARG DEBIAN_FRONTEND=noninteractive

14注意:在大多数情况下,sudo 不会传递环境变量,所以 sudo DEBIAN_FRONTEND=noninteractive sudo apt-get install -y tzdata 是有效的,但 DEBIAN_FRONTEND=noninteractive sudo apt-get install -y tzdata 不行。 - Brendan Long
77对于Dockerfile,请添加以下内容:ENV DEBIAN_FRONTEND=noninteractive - jersey bean
2在一个案例中,这种方法在Ubuntu 18.04上无效。但是以下答案可以修复Ubuntu 18.04上的问题。 - tmanthey
2请查看https://askubuntu.com/a/1098881/112499,因为那个答案实际上修复了问题,而不是像这个回答一样隐藏它。 - Shadow
6@jerseybean 这种方法是极不推荐的,详细解释请参考这里:https://github.com/moby/moby/issues/4032 - Akito
1我以为这就是 -y 应该完成的功能。 - Wyck

在Ubuntu 18.04上,我做了以下操作 Dockerfile:
ENV TZ=Europe/Minsk
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt update && apt instal....

似乎对我来说并没有什么区别,当我尝试使用美国/丹佛时。也许是因为我的时区信息有误。 - wordsforthewise
9环境持久性可能会导致意想不到的副作用。要为单个命令设置值,请使用RUN <key>=<value> <command>。您还可以尝试ARG。 - Mihai Capotă
如果可能的话,请尽量在服务器上运行的任何代码中使用UTC时间。请参阅这篇(稍微带有讽刺意味的)文章 - cfstras

简而言之: 在你的DockerFile中

ENV DEBIAN_FRONTEND=noninteractive 

原因:
某些安装程序通过具有良好的前端界面使“安装”变得更加容易。当您进行手动安装时,这非常棒,但在自动化安装过程中会成为一个问题。
您可以通过将以下内容放入环境字符串来覆盖交互式安装。
祝好!

11Docker的最佳实践是不要使用ENV,因为这会使环境变量在最终镜像中持久存在。 - Mihai Capotă

在执行命令之前,您可以设置DEBIAN_FRONTEND=noninteractive以避免ENV DEBIAN_FRONTEND=noninteractive影响后续命令或子镜像。
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        tzdata \
    && rm -rf /var/lib/apt/lists/*

在安装tzdata之前,你应该先设置好你的时区。
# Set timezone:
RUN ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone

# Install dependencies:
RUN apt-get update && apt-get install -y tzdata

6这对我在Ubuntu 20.04上有效。设置DEBIAN_FRONTEND=noninteractive没有起作用! - Thomas