なにもわからない

気分で技術系の雑記を書きます

Docker nginx 公式イメージで nginx-debug を使う

Nginx でちょっとでも複雑な設定を書こうとすると、通常のログでは状況を把握しにくい。 より詳細なデバッグログを出すには nginx-debug バイナリが必要で、通常 nginx start しているのを nginx-debug start して、debug level specification を指定してやる必要がある。

Pre-built Linux packages provide out-of-the-box support for debugging log with the nginx-debug binary (1.9.8) which can be run using commands

To avoid this, either the line redefining the log should be commented out, or the debug level specification should also be added:

nginx.org

docker.io 上のイメージには 1.9.8 からバイナリがあるのが確認できる。

$ docker run -it --rm nginx:1.9.7 whereis nginx-debug
nginx-debug:

$ docker run -it --rm nginx:1.9.8 whereis nginx-debug
nginx-debug: /usr/sbin/nginx-debug

どうも https://github.com/nginxinc/docker-nginx のリリースは必ずしも Pull Request を作ってリリースしている訳ではないらしく時系列が負いにくくいつからかはわからないが、このコミット以降 docker-entrypoint.sh の第一引数を参照するようになった模様。

github.com

docker-entrypoint.sh の引数に nginx-debug を指定すればいいだけなので、こう。ENTRYPOINT 自体を書き換える必要はない。

FROM nginx:1.19.1

COPY ./default.conf /etc/nginx/conf.d/default.conf

CMD ["nginx-debug", "-g", "daemon off;"]

デバッグログは常に必要な訳ではないので(むしろ邪魔)、docker build --target を活用してこう書くことが多い。

FROM nginx:1.19.1 as production-pseudo

COPY ./default.conf /etc/nginx/conf.d/default.conf

# --

FROM production-pseudo as development

# --

FROM development as debug

CMD ["nginx-debug", "-g", "daemon off;"]

実際に使っている Nginx のバージョンが古い場合、nginx.orgリポジトリであれば多少バージョンが古くても nginx-debug バイナリも含めてパッケージを配布してくれており、これが使える。バージョンを上げられるならこれを機に上げてしまったほうがよいと思う。

FROM debian:10.4

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      curl \
      gnupg2 \
      ca-certificates \
      lsb-release \
      software-properties-common \
      && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --keyserver-options timeout=10 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 && \
    add-apt-repository "deb https://nginx.org/packages/debian/ buster nginx"

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
      nginx=1.16.1-1~buster \
      && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*