Featured image of post Dockerfileのビルドがタイムゾーンの入力で止まってしまう問題を回避する方法

Dockerfileのビルドがタイムゾーンの入力で止まってしまう問題を回避する方法

これはなに Link to this heading

Dockerfileをビルドした際に、docker buildがタイムゾーンの入力で止まってしまう問題に遭遇した。これを回避する方法のメモ。

問題を再現する Link to this heading

以下のDockerfileをビルドする。

Dockerfile
FROM ubuntu:18.04

RUN apt update -y \
    && apt install -y --no-install-recommends \
    language-pack-en
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.en
ENV LC_ALL en_US.UTF-8

RUN apt update -y \
    && apt install -y --no-install-recommends \
    tk-dev

すると、localeを設定した後のapt installで、以下のようにタイムゾーンの入力を要求されてしまい、ビルドが途中で止まってしまう。

 => [dev_container_auto_added_stage_label 3/3] RUN apt update -y     && apt instal  425.7s
 => => # 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:

ちなみにlocaleを設定しない場合は、タイムゾーンの設定も要求されないため、ビルドが途中で止まる事態にはならない。

回避方法 Link to this heading

回避方法1 | DEBIAN_FRONTEND=noninteractiveをつける Link to this heading

ビルドが途中で止まってしまう原因は入力のダイアログが表示されてしまうことである。そのため、apt installの前にDEBIAN_FRONTEND=noninteractiveをつける。これをつけると対話式の命令をスキップできる。

Dockerfile
FROM ubuntu:18.04

RUN apt update -y \
    && apt install -y --no-install-recommends \
    language-pack-en
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.en
ENV LC_ALL en_US.UTF-8

RUN apt update -y \
-   && apt install -y --no-install-recommends \
+   && DEBIAN_FRONTEND=noninteractive apt install -y --no-install-recommends \
    tk-dev

DEBIAN_FRONTENDは、aptのユーザーインターフェースを構成するために使用される環境変数である。 そのため、DEBIAN_FRONTENDの値は環境変数としても指定できる。

ENV DEBIAN_FRONTEND=noninteractive

ただし、環境変数で指定する方法は、そのDockerイメージで生成されるすべてのコンテナに影響を与えてしまう。そのため、たとえばそのイメージを使う人がソフトウェアをインタラクティブに設定する際、ダイアログが表示されず、問題が生じうる。公式のドキュメント でも推奨されていない。

よって、DEBIAN_FRONTEND=noninteractive apt installとして一時的に変更し使用するのが良い。 万が一環境変数で指定する場合は、必ず最後にDEBIAN_FRONTENDデフォルト値 に戻す。

回避方法2 | タイムゾーンを設定する Link to this heading

今回はタイムゾーンの設定ダイアログによってビルドが途中で止まってしまっている。そのため、その前にタイムゾーンを設定すれば回避できる。

Dockerfile
FROM ubuntu:18.04

RUN apt update -y \
    && apt install -y --no-install-recommends \
    language-pack-en
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.en
ENV LC_ALL en_US.UTF-8
+ RUN ln -snf /usr/share/zoneinfo/America/New_York /etc/localtime

RUN apt update -y \
    && apt install -y --no-install-recommends \
    tk-dev

タイムゾーンの設定方法は複数あるが、今回は/etc/localtime/usr/share/zoneinfo/ディレクトリのファイルのシンボリックリンクを貼ってタイムゾーンを設定した。Ubuntuのタイムゾーンを設定する方法は下記の記事が参考になる。

[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ's image

[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ

zenn.dev

参考文献・URL Link to this heading

Dockerfileで思考停止的にENV DEBIAN_FRONTEND noninteractiveを書いてはいかん | てくてく無窮動's image

Dockerfileで思考停止的にENV DEBIAN_FRONTEND noninteractiveを書いてはいかん | てくてく無窮動

mukiudo.dev
DEBIAN_FRONTEND=noninteractive's image

DEBIAN_FRONTEND=noninteractive

zenn.dev
's image

linuc.org

linuc.org
[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ's image

[Linux(Ubuntu)]タイムゾーンを日本時間にする5つの方法まとめ

zenn.dev
Licensed under CC BY-NC-SA 4.0
最終更新 5月 21, 2023
Hugo で構築されています。
テーマ StackJimmy によって設計されています。