Podman - Containerfile
概要
PodmanのContainerfileは、DockerのDockerfileと非常に似ているが、コンテナイメージを作成するためのOCI (Open Container Initiative) 準拠の方法である。
Containerfileは、Podmanを使用してコンテナイメージを作成する際の標準的な方法であり、Dockerユーザにとっても馴染みやすい形式となっている。
OCI準拠であることから、より広範なコンテナエコシステムでの互換性が確保されている。
Containerfileの主要な特徴と要素を以下に示す。
- 基本的な構造
- Containerfileは、Dockerfileとほぼ同じ構文を使用する。
- 各行は命令 (大文字) とその引数で構成される。
- 主要な命令
- FROM
- ベースイメージを指定する。
- RUN
- コンテナ内でコマンドを実行する。
- COPY / ADD
- ホストからコンテナにファイルをコピーする。
- WORKDIR
- 作業ディレクトリを設定する。
- ENV
- 環境変数を設定する。
- EXPOSE
- コンテナがリッスンするポートを指定する。
- CMD / ENTRYPOINT
- コンテナ起動時に実行されるコマンドを定義する。
- FROM
- Dockerfile との互換性
- 多くの場合、DockerfileをそのままContainerfileとして使用することができる。
- ファイル名をContainerfileに変更するだけで、Podmanで使用可能となる。
- OCI準拠
- ContainerfileはOCI仕様に準拠しているため、より標準化されている。
- これにより、異なるコンテナランタイム間での移植性が向上する。
- ルートレス操作
- Podmanはルートレスモードをサポートしているため、Containerfile内でのルート権限の使用を最小限に抑えることができる。
- マルチステージビルド
- Dockerと同様、複数のFROM命令を使用したマルチステージビルドをサポートしている。
- ビルドコンテキスト
- Containerfileがある現在のディレクトリがビルドコンテキストになる。
- .containerignoreファイル (または、.dockerignore) を使用して、不要なファイルを除外できる。
- 環境変数とアーギュメント
- ENV命令で環境変数を設定できる。
- ARG命令でビルド時の変数を定義できる。
- ヘルスチェック
- HEALTHCHECK命令を使用してコンテナの健全性チェックを定義できる。
- セキュリティ考慮事項
- USER命令を使用して、特定のユーザとしてコマンドを実行できる。
- ただし、機密情報の扱いには注意が必要である。
- レイヤーとキャッシング
- 各命令は新しいレイヤーを作成して、Podmanはこれらをキャッシュする。
- 効率的なレイヤー管理により、ビルド時間を短縮できる。
Containerfile
Containerfileとは
Containerfileは、コンテナイメージの作成手順を自動化する設定ファイルである。
コンテナエンジン (Podman、Buildah、Docker) は、Containerfileから指示を読み取り、イメージの作成に必要なステップを自動化する。
イメージを構築を自動化するには、Containerfileというファイルを作成する必要がある。
Containerfileには、コンテナを構築するためのベースになる環境、実行するコマンド、配置するファイル等が記述されている。
Containerfileには、Containerfileを含むコンテキストディレクトリのパスを引数として、buildah bud
、podman build
コマンドを呼び出す。
PodmanおよびBuildahのデフォルトはContainerfileであり、Dockerfileにフォールバックする。
Containerfileは、Dockerfileと同じシンタックスをサポートしている。
Containerfileで作成したPodmanイメージをQuay.ioにアップロードすることも可能である。
イメージの構築
Podmanでは、省略して使用できるContainerfileの名称が予め決まっている。
以下に示すファイル名をデフォルトのコンテナファイルとして認識する。
- Containerfile (最優先)
- containerfile (小文字)
- Dockerfile
- dockerfile (小文字)
これらのファイルは、-f
オプション無しで使用できる。
順序は上から順に検索されて、最初に見つかったファイルが使用される。
podman build -t <任意のリポジトリ名>:<タグ名> .
ただし、大文字から始まるContainerfile、または、Dockerfileを使用することが推奨される。
小文字から始まるファイル名もサポートされているが、一般的にはほとんど使用されない。
podman build -t <任意のリポジトリ名>:<任意のタグ名> . # Containerfileのパスを指定する場合 podman build -t <任意のリポジトリ名>:<任意のタグ名> -f <Containerfileのパス>
シンタックス
FROM
FROM <pullするイメージ名>:<タグ名> # 別名を指定する場合 FROM <pullするイメージ名>:<タグ名> AS <別名> # FROM <pullするイメージ名>@<ダイジェスト名> # 別名を指定する場合 FROM <pullするイメージ名>@<ダイジェスト名> AS <別名>
MAINTAINER
MAINTAINERは生成されたイメージの作者フィールドを設定する。
ユーザにサポートのためのEメールもしくはURLを提供する場合に使用する。
MAINTAINER <作者名> <メールアドレス>
USER
コンテナ内のユーザを指定する。
# ユーザをrootにする USER root
WORKDIR
作業ディレクトリを追加する。
WORKDIR <作業ディレクトリパス>
ARG
Containerfile内で使用する変数を定義する。
# 変数を定義する場合 ARG <変数名> # 変数を定義して値を代入する場合 ARG <変数名>=<値>
ENV
環境変数を定義する。
ENV <環境変数名> <値> # または ENV <環境変数名>=<値>
ADD
イメージにファイルやディレクトリを追加する。
# ファイルまたはディレクトリを1つ追加する場合 ADD <ホスト側のファイルまたはディレクトリのパス> <コンテナ側のファイルまたはディレクトリのパス> # ファイルまたはディレクトリを複数追加する場合 ADD <ホスト側のファイルまたはディレクトリのパス 1> <ホスト側のファイルまたはディレクトリのパス 2> ... <コンテナ側のファイルまたはディレクトリのパス> # []で囲むこともできる ADD ["<ホスト側のファイルまたはディレクトリのパス 1>", "<ホスト側のファイルまたはディレクトリのパス 2>" ... "<コンテナ側のファイルまたはディレクトリのパス>"]
COPY
ホスト側のファイルおよびディレクトリをイメージに複製する。
# ファイルまたはディレクトリを1つ追加する場合 COPY <ホスト側のファイルまたはディレクトリのパス> <コンテナ側のファイルまたはディレクトリのパス> # ファイルまたはディレクトリを複数追加する場合 COPY <ホスト側のファイルまたはディレクトリのパス 1> <ホスト側のファイルまたはディレクトリのパス 2> ... <コンテナ側のファイルまたはディレクトリのパス> # []で囲むこともできる COPY ["<ホスト側のファイルまたはディレクトリのパス 1>", "<ホスト側のファイルまたはディレクトリのパス 2>" ... "<コンテナ側のファイルまたはディレクトリのパス>"]
EXPOSE
コンテナ実行時にリッスンするポート番号を指定する。
# ポートを1つ開放する場合 EXPOSE <ポート番号> # ポートを複数開放する場合 EXPOSE <ポート番号 1> <ポート番号 2> ...
ENTRYPOINT
コンテナの起動時に実行する処理を指定する。
# 実行可能コマンドを指定する # 実行可能コマンドは、フルパスを指定しなければならない。 ENTRYPOINT ["<実行可能コマンド>", "<引数 1>", "<引数 2>", "<引数...>"] # シェルで実行するコマンドを指定する : /bin/sh -c "<コマンド> <引数 1> <引数 2> <引数...>" ENTRYPOINT <コマンド> <引数 1> <引数 2> <引数...>
RUN
RUNには2つのシンタックスがある。
# 実行可能コマンドを指定する # 実行可能コマンドは、フルパスを指定しなければならない。 RUN ["<実行可能コマンド>", "<引数 1>", "<引数 2>", "<引数...>"] # シェルで実行するコマンドを指定する : /bin/sh -c "<コマンド> <引数 1> <引数 2> <引数...>" RUN <コマンド> <引数 1> <引数 2> <引数...>
RUN mounts
コンテナにファイルシステムをマウントする。
現在サポートされているマウントの種類は、bind、cache、secret、tmpfsである。
- RUN mountsの全体のオプション
- src / source
- ボリュームおよびbindのマウント元のパスを指定する。 (bindでは必須である)
from
を指定する場合、src
はfrom
フィールドのサブパスになる。
- dst / destination / target
- マウント先の指定する。
- ro / read-only
true
(デフォルト) またはfalse
を指定する。
- src / source
- マウントの種類がbindのみの設定
- bind-propagation
shared
、slave
、private
、rshared
、rslave
、rprivate
(デフォルト)
- bind-nonrecursive
- 再帰的なバインドマウントを設定しない。
- デフォルトでは再帰的である。
- from
- src / sourceのルートのステージ名またはイメージ名を指定する。
- デフォルトはビルドコンテキスト。
- rw / read-write
- マウントへの書き込みを許可する。
- bind-propagation
- マウントの種類がtmpfsのみの設定
- tmpfs-size
- tmpfsマウントのサイズ (バイト)。
- Linuxのデフォルトでは無制限である。
- tmpfs-mode
- tmpfsのファイルモードを8進数で指定する。
- Linuxのデフォルトは1777である。
- tmpcopyup
- tmpfsマウントによりシャドウされるパスは、tmpfs自体に再帰的にコピーされる。
- tmpfs-size
- マウントの種類がcacheのみの設定
- id
- 特定のidに対して、個別のキャッシュディレクトリを作成する。
- mode
- 新しいキャッシュディレクトリのファイルモード (8進数) を指定する。
- デフォルトは0755である。
- ro / readonly
- キャッシュの読み取り専用となる。
- uid
- キャッシュディレクトリのuid。
- gid
- キャッシュディレクトリのgid。
- from
- src / sourceのルートのステージ名を指定する。
- デフォルトはホストキャッシュディレクトリである。
- rw / read-write
- マウントへの書き込みを許可する。
- id
RUN mounts type=<マウントの種類>,<ホスト側のパス>:<コンテナ側のパス> # マウントの種類はbind、ホスト側のパスは/tmp/sample1、コンテナ側のパスは/tmp/sample2の場合 RUN mounts type=bind,source=/tmp/sample1,destination=/tmp/sample2 # マウントの種類はtmpfs、サイズは512[MB]、コンテナ側のパスは/tmp/directoryの場合 RUN mounts type=tmpfs,tmpfs-size=512M,destination=/tmp/directory # マウントの種類はsecret、IDはmysecret、コンテナ側のsecretのパスは/tmp/secret/mysecretの場合 RUN mounts type=secret,id=mysecret cat /run/secrets/mysecret
CMD
ContainerfileのCMDは1つのみ指定できる。
複数のCMDが記述されている場合は、最後のCMDのみが有効になる。
CMDには3つのシンタックスがある。
# 実行可能コマンドを指定する # 実行可能コマンドは、フルパスを指定しなければならない。 # 例: CMD ["/usr/bin/wc","--help"] CMD ["<実行可能コマンド>", "<引数 1>", "<引数 2>", "<引数...>"] # 実行可能ファイルを省略する場合は、ENTRYPOINTにデフォルトの引数を指定する CMD ["<引数 1>", "<引数 2>", "<引数...>"] # シェルで実行するコマンドを指定する : /bin/sh -c "<コマンド> <引数 1> <引数 2> <引数...>" # 例: CMD echo "This is a test." | wc - CMD <コマンド> <引数 1> <引数 2> <引数...>