オリジナルイメージ(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も同様)
次の記事