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