whalesay イメージの検索と実行

Docker

docker run docker/whalesayがエラーになる

こちらのDocker ドキュメントのwhalesay イメージの検索と実行を学習しようとして、下記コマンドを入力するとエラーになりました。

下記は、エラー内容です。

Unable to find image 'docker/whalesay:latest' locally
docker: Error response from daemon: [DEPRECATION NOTICE] Docker Image Format v1 and Docker Image manifest version 2, schema 1 support is disabled by default and will be removed in an upcoming release. Suggest the author of docker.io/docker/whalesay:latest to upgrade the image to the OCI Format or Docker Image manifest v2, schema 2. More information at https://docs.docker.com/go/deprecated-image-specs/.
See 'docker run --help'.

最新のDocker ドキュメントでは、whalesayに関する記述はなくなっています。

エラーの原因は、公式イメージ「docker/whalesay」が古い形式のままであるため、使用できないことにあります。そこで今回は、新しく「whalesay」を作成して対応することにしました。

docker run docker/whalesayのエラー原因

Dockerイメージ形式が古い
docker/whalesayイメージは、Docker Image Format v1 または Docker Image Manifest v2, Schema 1 形式で作成されていて、形式が古く、新しいDockerバージョンではデフォルトで無効化されているためのようです。

Dockerの仕様変更
Dockerは、イメージ形式の互換性を維持するために長らくサポートしていましたが、非推奨となり新しい形式(OCI FormatやDocker Image Manifest v2, Schema 2)への移行を進めています。

OCI Format、Docker Image Manifest v2, Schema 2って何?

OCI Format
概要
  • OCI(Open Container Initiative)は、コンテナランタイムとイメージの標準仕様を定める業界団体です。
  • Docker社が提供していた独自仕様をオープンスタンダード化したもの。
  • コンテナイメージの互換性と移植性を向上させる目的で開発。
特徴
  • 標準化: OCIイメージ仕様は、DockerやPodman、Kubernetesなど、主要なツールでサポート。
  • 移植性: 異なるコンテナランタイム間でのイメージの移植が簡単。
  • シンプルな構造: イメージのレイヤーやメタデータが扱いやすい構造に改善。
OCIイメージの構造
  • Manifest: イメージのメタデータ(レイヤー構成やエントリポイントなど)。
  • Config: イメージの設定情報(環境変数、コマンド、作業ディレクトリなど)。
  • Layers: コンテナのファイルシステムを表す圧縮されたレイヤー。
Docker Image Manifest v2
概要
  • Dockerが提供するコンテナイメージの仕様。
  • イメージのメタデータを管理するManifestのバージョン2。
  • Schema 1の非効率な部分を改良し、OCI Formatと互換性を持たせています。
特徴
  • 効率化: レイヤー管理が効率化され、イメージのプッシュ/プル速度が向上。
  • セキュリティ: デジタル署名やハッシュによる改ざん検知をサポート。
  • マルチプラットフォーム対応: 異なるアーキテクチャ(例: amd64, arm64)のイメージを単一のマニフェストで管理可能。

Schema 1 と Schema 2 の違い

特徴Schema 1Schema 2
導入時期初期のDockerイメージフォーマット2015年以降
レイヤー管理非効率なリンクリスト形式フラットなリスト形式で効率的
セキュリティハッシュによる検証なし各レイヤーのSHA256ハッシュで検証
マルチプラットフォーム非対応対応
OCIとの互換性非互換互換

whalesayを作成

whalesayをPythonで新規作成し、ソースからイメージをビルドすることにしました。
作成するwhalesayの仕様は、下記の通りです。

whalesayソースコード(Python)の作成

Dockerfileの作成

  • FROM python:3.9-slim
    ベースとなるイメージとしてpython:3.9-slimを使用
  • RUN
    イメージにコマンドを実行し、その結果を保存します。
    ここではapt-getを使用して追加パッケージをインストールしています。
  • apt-get install -y
    以下の2つのパッケージをインストールします。
    fortune-mod:ランダムなメッセージ(名言やジョーク)を表示するコマンド。
    busybox:シンプルで軽量なLinuxツール集。シェルやファイル操作コマンドが含まれる。
  • apt-get clean
    キャッシュをクリアし、イメージサイズを削減します。
  • rm -rf /var/lib/apt/lists/*
    apt-getで使用したパッケージリストを削除し、イメージをさらに軽量化。
  • ENV PATH=”/usr/games:${PATH}”
    環境変数PATH/usr/gamesディレクトリを追加。
    fortune-modは通常/usr/gamesにインストールされますが、PATHに含まれていない場合、コマンドが見つからなくなります。
  • WORKDIR /app
    コンテナ内での作業ディレクトリ(カレントディレクトリ)を設定。
    以降のコマンド(例: COPYRUN)は/appディレクトリ内で実行されます。
  • COPY cowsay.py /app/
    ホストのcowsay.pyをコンテナ内の/app/ディレクトリにコピー。
  • RUN ln -sf /bin/busybox /bin/sh
    コンテナ内のデフォルトシェル/bin/shをBusyBoxのシェルに置き換え。
  • ENTRYPOINT [“python”, “/app/cowsay.py”]
    コンテナ起動時に実行するデフォルトのコマンドを設定。

Dockerイメージの作成

作業ディレクトリを作成し、whalesayソースコファイルをcowsay.pyとして保存する。
上記の内容で、Dockerfilを作成し保存する。
作業ディレクトリ内で、下記のコマンドを実行しイメージ構築する。

Dockerイメージの確認と実行

下記のコマンドでDockerイメージを確認する。

下記はDockerイメージの実行例です。

以上で、Docker ドキュメントの自分でイメージを構築までが完了しました。

次は、Docker ドキュメントのDocker Hub アカウントとリポジトリの作成から進むことができます。

タイトルとURLをコピーしました