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

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

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

例如:

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: 

奇怪的是,当我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

问题:

  • tzdata为什么我在添加 ppa 之前或之后安装会有区别?
  • 有没有更好的方法可以避免安装 certbot 时出现交互式对话框?

答案1

如果要在不使用交互对话框的情况下运行dpkg(在其他工具(如 Apt)之后),可以设置一个环境变量,如下所示

DEBIAN_FRONTEND=noninteractive

例如,你可以在 Dockerfile 中使用以下方式进行设置阿根廷

ARG DEBIAN_FRONTEND=noninteractive

答案2

在 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....

答案3

总结: 在你的 DockerFile 中

ENV DEBIAN_FRONTEND=noninteractive 

原因:

某些安装程序通过提供良好的前端使“安装”变得更容易。虽然这在手动安装时非常有用,但在自动安装期间这会成为一个问题。

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

干杯

答案4

你应该设置你的时区安装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

相关内容