DamienKarrus’s blog

プログラミングとクライミングの足跡

オリジナルイメージ(2) Dockerfileの書式 Docker入門-10

Dockerfileの書式について簡単にまとめる。 書式を説明するにあたり、既存イメージのDockerfileを例にとると、 httpdのイメージのDockerfileはこのようになっている

FROM debian:bullseye-slim

ENV HTTPD_PREFIX /usr/local/apache2
ENV PATH $HTTPD_PREFIX/bin:$PATH
RUN mkdir -p "$HTTPD_PREFIX" \
    && chown www-data:www-data "$HTTPD_PREFIX"
WORKDIR $HTTPD_PREFIX

# install httpd runtime dependencies
# https://httpd.apache.org/docs/2.4/install.html#requirements
RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        libaprutil1-ldap \
        libldap-common \
    ; \
    rm -rf /var/lib/apt/lists/*

ENV HTTPD_VERSION 2.4.52
ENV HTTPD_SHA256 0127f7dc497e9983e9c51474bed75e45607f2f870a7675a86dc90af6d572f5c9
ENV HTTPD_PATCHES=""

# see https://httpd.apache.org/docs/2.4/install.html#requirements
RUN set -eux; \
    \
    # mod_http2 mod_lua mod_proxy_html mod_xml2enc
    # https://anonscm.debian.org/cgit/pkg-apache/apache2.git/tree/debian/control?id=adb6f181257af28ee67af15fc49d2699a0080d4c
    savedAptMark="$(apt-mark showmanual)"; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        bzip2 \
        ca-certificates \
        dirmngr \
        dpkg-dev \
        gcc \


...(snip)...


STOPSIGNAL SIGWINCH

COPY httpd-foreground /usr/local/bin/

EXPOSE 80
CMD ["httpd-foreground"]

FROM debian:bullseye-slim
debian:bullseye-slim をベースイメージにしている

RUN mkdir ...
RUN set -eux; ...
RUN set -eux; ...
→RUNでapacheのパッケージ(ソースコード)からインストールし、パッチを当ててから make install している。

STOPSIGNAL SIGWINCH
→docker stopした場合、コンテナでCMDなどによって実行されているプロセスにSIGTERMシグナルが送信される。apacheの場合は、プロセス停止はSIGWINCHなので、docker stop後に、apacheがtimeoutするまで待つことになる。そこでここで終了シグナルを明記しておくことにより、timeoutを待たずに終了させることが出来る。

EXPOSE 80
→このパッケージはPORT80で通信するよう作られていることがわかる

CMD ["httpd-foreground"]
→docker run したときは httpd-foreground というコマンドが実行される

よく使うコマンドとしては以下の通り   

命令 説明
FROM ベースイメージを指定する
COPY ファイルやフォルダを追加する
ADD ファイルやフォルダを追加する。圧縮ファイルを指定したときは自動的に展開される(tar/tar.gz/tar.bz2/tar.xz) コピー元にURLを指定しファイルをダウンロードできる(圧縮ファイルは展開されない)
RUN イメージをビルドするときに実行する
CMD
ENTRYPOINT
コンテナを起動するときに実行する既定のコマンドを指定する
EXPOSE 通信を想定するポートの初期値を指定する
VOLUME 外部に保存するデータのマウントポイントの初期値を指定する
ENV 環境変数を定義する

COPY/ADDでは、foo/*.php などワイルドカードも指定できる。ADDは挙動が分かり辛くなるため非推奨になるかもしれない。
実行系ではRUNがイメージ作成時に実行され、CMD/ENTRIPOINTはコンテナ起動時に実行される。つまり RUNはイメージの作成に使用される。

 RUN コマンド1 && コマンド2 && コマンド3 

とする。これは、RUN1つごとに差分レイヤーが作られてしまうため、なるべく一連の動作は1つのRUNコマンドにまとめる。 ビルド完了時になんかコマンドを実行したいときは ONBUILD を使う。

 ONBUILD COPY  コピー元 コピー先
 ONBUILD RUN  コマンド 引数・・・

CMDとENTRYPOINT
docker container run の際にイメージの後に実行コマンドを指定するが、CMD は、この実行コマンドのデフォルト値を設定している。もしユーザが異なるコマンドを指定した場合は、ユーザが指定したコマンドが実行される。
一方 ENTRYPOINT によって指定された場合は、必ずここで指定されたコマンドが実行され、ユーザが docker container run した場合に指定されたものがあれば、それはここで指定されているコマンドへのパラメータとして扱われる。
書式は2種類あり、シェル形式の場合は

 CMD コマンド 引数 ・・・

exec形式の場合は

 CMD ["コマンド","引数",・・・]

いずれの書式でも指定できる(ENTRYPOINTも同様)

次の記事

damienkarrus.hatenablog.com