Podman - Containerfile

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

PodmanのContainerfileは、DockerのDockerfileと非常に似ているが、コンテナイメージを作成するためのOCI (Open Container Initiative) 準拠の方法である。

Containerfileは、Podmanを使用してコンテナイメージを作成する際の標準的な方法であり、Dockerユーザにとっても馴染みやすい形式となっている。
OCI準拠であることから、より広範なコンテナエコシステムでの互換性が確保されている。

Containerfileの主要な特徴と要素を以下に示す。

  • 基本的な構造
    Containerfileは、Dockerfileとほぼ同じ構文を使用する。
    各行は命令 (大文字) とその引数で構成される。

  • 主要な命令
    • FROM
      ベースイメージを指定する。
    • RUN
      コンテナ内でコマンドを実行する。
    • COPY / ADD
      ホストからコンテナにファイルをコピーする。
    • WORKDIR
      作業ディレクトリを設定する。
    • ENV
      環境変数を設定する。
    • EXPOSE
      コンテナがリッスンするポートを指定する。
    • CMD / ENTRYPOINT
      コンテナ起動時に実行されるコマンドを定義する。

  • 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 budpodman buildコマンドを呼び出す。
PodmanおよびBuildahのデフォルトはContainerfileであり、Dockerfileにフォールバックする。

Containerfileは、Dockerfileと同じシンタックスをサポートしている。

Containerfileで作成したPodmanイメージをQuay.ioにアップロードすることも可能である。

イメージの構築

Podmanでは、省略して使用できるContainerfileの名称が予め決まっている。
以下に示すファイル名をデフォルトのコンテナファイルとして認識する。

  1. Containerfile (最優先)
  2. containerfile (小文字)
  3. Dockerfile
  4. 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を指定する場合、srcfromフィールドのサブパスになる。
    • dst / destination / target
      マウント先の指定する。
    • ro / read-only
      true (デフォルト) または falseを指定する。

  • マウントの種類がbindのみの設定
    • bind-propagation
      sharedslaveprivatersharedrslaverprivate (デフォルト)
    • bind-nonrecursive
      再帰的なバインドマウントを設定しない。
      デフォルトでは再帰的である。
    • from
      src / sourceのルートのステージ名またはイメージ名を指定する。
      デフォルトはビルドコンテキスト。
    • rw / read-write
      マウントへの書き込みを許可する。

  • マウントの種類がtmpfsのみの設定
    • tmpfs-size
      tmpfsマウントのサイズ (バイト)。
      Linuxのデフォルトでは無制限である。
    • tmpfs-mode
      tmpfsのファイルモードを8進数で指定する。
      Linuxのデフォルトは1777である。
    • tmpcopyup
      tmpfsマウントによりシャドウされるパスは、tmpfs自体に再帰的にコピーされる。

  • マウントの種類がcacheのみの設定
    • id
      特定のidに対して、個別のキャッシュディレクトリを作成する。
    • mode
      新しいキャッシュディレクトリのファイルモード (8進数) を指定する。
      デフォルトは0755である。
    • ro / readonly
      キャッシュの読み取り専用となる。
    • uid
      キャッシュディレクトリのuid。
    • gid
      キャッシュディレクトリのgid。
    • from
      src / sourceのルートのステージ名を指定する。
      デフォルトはホストキャッシュディレクトリである。
    • rw / read-write
      マウントへの書き込みを許可する。


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> <引数...>