Docker, PodmanでDNSサーバーのIPアドレスをnginxのresolverに動的に設定

Dockerでnginxを使っていろいろしていたらresolverの設定が必要になる事がありました。

その際、resolverにハードコードしたIPアドレスを指定して動かしていたのですが、Podmanから同じプロジェクトを動かした時にエラーになりました。


調査したところ、原因はDockerとPodmanが作成する/etc/resolv.confの内容が違うためでした。

これはDockerのもので、Podmanはまた違う内容になっています。

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 127.0.0.11
options ndots:0

# Based on host file: '/etc/resolv.conf' (internal resolver)
# ExtServers: [192.168.65.7]
# Overrides: []
# Option ndots from: internal

DockerとPodmanではデフォルトのDNSサーバーのIPアドレスが違い、またよく調査していないですがPodmanは何かの拍子でIPアドレスが変わってしまったので今回の対応をするに至りました。


以下に設定内容を示します。

# compose.yml
services:
  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/templates:/etc/nginx/templates
      - ./nginx/conf.d:/etc/nginx/conf.d
    entrypoint: [
        "sh",
        "-c",
        "export DNS_SERVER=$(grep '^nameserver' /etc/resolv.conf | awk '{print $2}' | head -n 1) && /docker-entrypoint.sh nginx -g 'daemon off;'",
      ]

entrypointの内容を見てください。

コンテナの起動時に、/etc/resolv.confファイルのnameserverの指定がある最初の行の値を環境変数にセットしています。

続けて、nginxイメージのデフォルトの挙動をそのまま踏襲します。

# /nginx/templates/hoge.conf.template
resolver ${DNS_SERVER};

セットした環境変数はこのように使用します。

nginxはコンテナの起動時に/etc/nginx/templates/*.conf.templateに環境変数を展開し、/etc/nginx/conf.d/*.confに配置する処理を自動的に行います。

# /nginx/nginx.conf
http {
    include /etc/nginx/conf.d/*.conf;
}

配置されたファイルを一番親となる設定ファイルから読み込んで完成です。

以上!