らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

distroless ベースの Nginx コンテナイメージを利用する

distroless ベースで Nginx の Docker コンテナである nginx-docker を作成したのでメモしておきます。

イメージサイズ

イメージサイズは 33.5MB でした。

# docker images sig9/nginx
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
sig9/nginx   latest    eaa3878ec1ef   16 minutes ago   33.5MB

尚、現時点 Nginx 公式の最新イメージは 141MB でした。

# docker images nginx
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    ea335eea17ab   10 days ago   141MB

使い方

ボリュームをマウントせずに起動する

ボリュームをマウントせずに起動する場合は以下のように実行します。 LB の Health Check 先として「とりあえず TCP/80 に応答すれば良い」といったケースで利用出来ると思います。

docker run --detach --tty --publish 8080:80 --name nginx sig9/nginx

ボリュームをマウントして起動する

ホストのボリュームをマウントして起動する場合は以下のように実行します。 指定したコンテンツが表示されることを確認したい場合に利用します。 docker run でボリュームをマウントする場合は相対パス指定が出来なかったと思いますので、${PWD} でパスを取得しています。

docker run --detach --tty --publish 8080:80 --volume ${PWD}/html:/usr/share/nginx/html --name nginx sig9/nginx

参考

現時点の Dockerfile は以下の内容で作成しました。

FROM nginx:1.20.2 AS builder

# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE="Asia/Tokyo"

RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /usr/sbin/nginx-debug /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base-debian11

COPY --from=builder /opt /

EXPOSE 80 443

ENTRYPOINT ["nginx", "-g", "daemon off;"]