#
ドキュメント

Document

自分のための備忘録です。

Dockerfile

Ref.

命令

Dockerfileで指定できるおもな命令。

命令 内容
FROM ベースイメージ指定
COPY コンテナ内のファイルシステムにコピー
RUN イメージをビルドするときに実行するコマンドを指定
CMD コンテナ起動時に実行
ENTRYPOINT コンテナ起動時に実行
EXPOSE ポート番号
ENV 環境変数
ARG 「ARG 命令は変数を定義して、ビルド時にその値を受け渡します。」
ref. https://docs.docker.jp/engine/reference/builder.html?highlight=arg#arg

コマンド実行

  • RUN・・・イメージ作成時に実行
  • CMD・ENTRYPOINT・・・コンテナ実行時に(1回かぎり)実行(つまり$ docker runのときに実行)

CMD

以下によって意味がことなる

  • ENTRYPOINT命令なし
  • ENTRYPOINT命令あり

ENTRYPOINT命令なし

コンテナの実行時のデフォルト処理を設定することです。 この処理設定においては、実行モジュールを含める場合と、実行モジュールを省略する場合があります。 省略する場合は ENTRYPOINT 命令を合わせて指定する必要があります。

https://docs.docker.jp/engine/reference/builder.html#cmd

ENTRYPOINTがない場合は実行モジュールを含める。

例) httpd

ENTRYPOINT命令はなくCMD命令のみ。

# Dockerfile
# ...
# ...
# デフォルト処理
CMD ["httpd", "DFOREGROUND"]

実際はシェルスクリプトをCOPYでコンテナにコピーして、実行している。

# https://github.com/docker-library/httpd/blob/077141ee37fca63972292c562ec0f632d0f831b1/2.4/Dockerfile
# Dockerfile
# ...
# ...
COPY httpd-foreground /usr/local/bin/

EXPOSE 80
CMD ["httpd-foreground"]

httpd-foreground

#!/bin/sh
set -e

# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid

exec httpd -DFOREGROUND "$@"

※ 位置パラメーター"$@"はすべてのパラメーターを表す。
https://fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html

ENTRYPOINT命令あり

実行モジュールを省略する。CMD命令に記載した値は、ENTRYPOINT命令の引数になる。

ENTRYPOINT

  • 実行可能モジュールを指定
  • ENTRYPOINT命令があるときCMD命令はENTRYPOINT命令の追加の引数として使用
  • docker runで引数が指定された場合はCMD命令は上書きされる
  • ENTRYPOINTを指定した場合、docker runでは--entrypointで上書きしない限り任意のプロセスは指定できない

docker run に対するコマンドライン引数は、exec 形式の ENTRYPOINT の指定要素の後に付け加えられます。 そして CMD において指定された引数は上書きされます。 これはつまり、引数をエントリーポイントに受け渡すことができるということです。 たとえば docker run -d としたときの -d は、引数としてエントリーポイントに渡されます。 docker run --entrypoint を利用すれば ENTRYPOINT の内容を上書きすることができます。

https://docs.docker.jp/engine/reference/builder.html#entrypoint

ENTRYPOINTとCMDが使用されている例

wordpress

Dockerfile
https://github.com/docker-library/wordpress/blob/dd8724a5b8c21eebd262aebf3593df0e13b5e917/latest/php7.4/fpm/Dockerfile

php:7.4.6を調査

php:7.4.6を調査。

$ docker pull php:7.4.6
$ docker inspect php:7.4.6

結果抜粋.

           "Cmd": [
                "php",
                "-a"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:79cc1ba190b4dd60b8acf8b5952def4ff458a6ddf50aa2ea83f887cf05067ec0",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "docker-php-entrypoint"
            ],
            "OnBuild": null,
            "Labels": null

コンテナにログインしてdocker-php-entrypointのパスを確認。

$ docker run -it php:7.4.6 /bin/bash
root@b21ffc5dc54d:/# find . -name docker-php-entrypoint
./usr/local/bin/docker-php-entrypoint

docker-php-entrypointの内容を確認。

root@b21ffc5dc54d:/# cat /usr/local/bin/docker-php-entrypoint

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
        set -- php "$@"
fi

exec "$@"

※ 位置パラメーター"$@"はすべてのパラメーターを表す。
https://fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html