在 docker 容器中安装 certbot 时避免用户与 tzdata 交互

Phi*_*ßen 217 apt automation docker letsencrypt

我想在带有 Ubuntu 16.04 映像的docker环境中安装certbot

例如:

docker run -it ubuntu:16.04 /bin/bash
Run Code Online (Sandbox Code Playgroud)

当我在容器内时,安装 certbot 的最直接方法不起作用,因为它需要用户干预:

apt-get update && \
apt-get install -y software-properties-common && \
add-apt-repository -y -u ppa:certbot/certbot && \
apt-get install -y certbot
Run Code Online (Sandbox Code Playgroud)

问题是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: 
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我tzdata在添加 ppa 之前安装时它可以工作:

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
Run Code Online (Sandbox Code Playgroud)

问题:

  • 为什么tzdata在添加 ppa 之前或之后安装会有所不同?
  • 安装 certbot 时是否有更好的方法来避免交互式对话框?

小智 249

要在dpkg没有交互式对话的情况下运行(在 Apt 等其他工具后面),您可以将一个环境变量设置为

DEBIAN_FRONTEND=noninteractive
Run Code Online (Sandbox Code Playgroud)

例如,您可以使用ARG在 Dockerfile 中设置它:

ARG DEBIAN_FRONTEND=noninteractive
Run Code Online (Sandbox Code Playgroud)

  • 对于 dockerfiles,添加:ENV DEBIAN_FRONTEND=noninteractive (66认同)
  • 注意:`sudo` 在大多数情况下不会传递环境变量,所以 `sudo DEBIAN_FRONTEND=noninteractive sudo apt-get install -y tzdata` 可以工作,但是 `DEBIAN_FRONTEND=noninteractive sudo apt-get install -y tzdata` 不会。 (7认同)
  • @jerseybean 这种方法是非常不鼓励的,如下所述:https://github.com/moby/moby/issues/4032 (4认同)
  • 我遇到过一个情况,这在 Ubuntu 18.04 上不起作用。但下面的答案确实在 Ubuntu 18.04 上修复了它。 (2认同)
  • 检查https://askubuntu.com/a/1098881/112499,因为该答案实际上解决了问题,而不是像这样隐藏它。 (2认同)

Ter*_*sim 73

在 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....
Run Code Online (Sandbox Code Playgroud)

  • [“环境持久化会导致意外的副作用。要为单个命令设置值,请使用 RUN <key>=<value> <command>。”](https://docs.docker.com/engine/reference/builder /#env) 您也可以尝试 [ARG](https://docs.docker.com/engine/reference/builder/#arg)。 (7认同)

小智 57

TL&DR: 在你的 DockerFile 中

ENV DEBIAN_FRONTEND=noninteractive 
Run Code Online (Sandbox Code Playgroud)

原因:

某些安装程序通过拥有漂亮的前端使“安装”更容易。虽然这在您手动安装时很好,但在自动安装期间这会成为一个问题。

您可以通过在您的环境字符串中放置以下内容来覆盖交互式安装。

干杯

  • Docker [“最佳实践是不使用 ENV,因为这会使 env-var 持久化到最终映像中”](https://github.com/moby/moby/issues/4032#issuecomment-163689851)。 (8认同)

小智 23

您可以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/*
Run Code Online (Sandbox Code Playgroud)


Jam*_*ond 6

您应该安装之前设置您的时区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
Run Code Online (Sandbox Code Playgroud)

  • 这在 Ubuntu 20.04 上对我有用。设置“DEBIAN_FRONTEND=noninteractive”没有! (6认同)