1. ホーム
  2. docker

[解決済み] Dockerfileで-hオプションのように特定のホスト名を扱う方法

2022-02-14 19:46:51

質問

CentOS 7をDockerデーモンホストとして、centos:6のDockerイメージを使用しています。

私は、ループバック以外のアドレスとして解決可能なホスト名を必要とするいくつかのソフトウェアをインストールしたいです。もし、Dockerイメージを-hオプション付きで実行すると、以下のようになります。

docker run -i -t -h myhost centos:6 /bin/bash

すると、コンテナ内の/etc/hostsが自動的に以下のように構成されるので、インストールすることができます。

[root@myhost /]# cat /etc/hosts
172.17.0.7  myhost
127.0.0.1   localhost    

[root@myhost /]# ping myhost
PING myhost (172.17.0.7) 56(84) bytes of data.
64 bytes from myhost (172.17.0.7): icmp_seq=1 ttl=64 time=0.033 ms

しかし、Dockerfileからイメージを作成する場合、同じ方法は使えません。そこで、以下のDockerfileを使用してイメージを作成することを試してみました。

FROM centos:6

ENV HOSTNAME myhost
RUN ping myhost

dockerのビルド処理で、以下のように割り当てられたホスト名が動的IPアドレスとして解決されないことがあります。

$ docker build -t testimage .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM centos:6
 ---> a30bc9f3097e
Step 1 : ENV HOSTNAME myhost
 ---> Using cache
 ---> e73bf592389e
Step 2 : RUN ping myhost
 ---> Running in ca54c8eac073
ping: unknown host myhost
INFO[0000] The command [/bin/sh -c ping myhost] returned a non-zero code: 2

動的コンテナIPアドレスとして解決された特定のホスト名を使用するにはどうすればよいですか?

解決方法は?

これはDockerfileでは一般的に不可能です。

ソフトウェアによっては、何らかの回避策を講じることができるかもしれません。例えば、次のようなことを試してみてください。

RUN echo $(grep $(hostname) /etc/hosts | cut -f1) my.host.name >> /etc/hosts && install-software

ソフトウェアのインストールと同じRUNコマンドでホスト名を設定することで、コンテナの同じレイヤーの中で行われることになります。Dockerは後でホスト名を上書きするので、実行時に新たに設定する必要がありますが、あなたのソフトウェアはそれで問題ないかもしれません。

もし、このようなことをたくさんしなければならない場合は、次のことを試してみてください。 パッカー コンテナ構築用。Dockerコンテナを構築することができますが、複数のレイヤーを使用することはありません。これにより、再構築は遅くなり、ビルドされたイメージのダウンロードは速くなり、コンテナにフリーズする前にイメージに対して複数の操作を行うことができるようになり、より便利になりました。