これはなに
Dockerfileをビルドした際に、docker build
がタイムゾーンの入力で止まってしまう問題に遭遇した。これを回避する方法のメモ。
問題を再現する
以下の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を設定しない場合は、タイムゾーンの設定も要求されないため、ビルドが途中で止まる事態にはならない。
回避方法
回避方法1 | DEBIAN_FRONTEND=noninteractiveをつける
ビルドが途中で止まってしまう原因は入力のダイアログが表示されてしまうことである。そのため、apt install
の前にDEBIAN_FRONTEND=noninteractive
をつける。これをつけると対話式の命令をスキップできる。
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 | タイムゾーンを設定する
今回はタイムゾーンの設定ダイアログによってビルドが途中で止まってしまっている。そのため、その前にタイムゾーンを設定すれば回避できる。
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のタイムゾーンを設定する方法は下記の記事が参考になる。