💡

Dockerfileビルド時のタイムゾーン設定での停止

2023/06/24に公開

Dockerfileでtzdataのインストールを非対話的に行う方法

Dockerを使ってイメージをビルドする際、一部のパッケージ(特にtzdata)のインストールで対話型のプロンプトが出てきて、ビルドが停止してしまうことがあります。(Dockerのビルドプロセスは基本的に非対話的なため。)

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

この記事では、Dockerfileのビルド時にtzdataのインストールを非対話的に行い、ビルドが停止しないようにする方法をご紹介します。

問題の原因

tzdataはタイムゾーンデータを提供するパッケージです。このパッケージのインストール時には、ユーザーに対して地理的な地域を選択するように求める対話的なプロンプトが表示されます。しかし、Dockerのビルドプロセスは非対話的なので、このプロンプトが表示されるとビルドプロセスは停止してしまいます。

解決方法

  • 検証環境
    • 作成するDockerイメージのOS:Ubuntu 20.04.6 LTS
    • Docker version 20.10.22

DEBIAN_FRONTEND=noninteractiveをtzdataインストールのタイミングに一時的に設定することで、タイムゾーンの設定を行いつつこの問題を解決することができます。以下にそのためのDockerfileの例を示します:

# Dockerfile
FROM ubuntu:latest

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

以上の設定で、tzdataインストール時にのみDEBIAN_FRONTENDの設定が有効になり、そのほかのコマンドや最終的なイメージに影響を与えません。

特定のタイムゾーンを設定したい場合は、以下のようにTZ環境変数を設定します。

# Dockerfile
FROM ubuntu:latest

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive TZ=Asia/Tokyo apt-get install -y tzdata && \
    ln -fs /usr/share/zoneinfo/$TZ /etc/localtime && \
    dpkg-reconfigure --frontend noninteractive tzdata && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

以上のようにDockerfileを設定することで、tzdataのインストールが非対話的に行われ、ビルドプロセスが停止する問題を回避することができます。

それでは、良い明日を〜。

Discussion