注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

コンテナ

このページでは、コンピュートモジュールで使用するための Docker の基本情報を提供します。詳細な説明については、Docker ドキュメント ↗を参照してください。

Docker の始め方

イメージをビルドおよび公開するには、まず Docker をインストールする必要があります。公式の手順に従ってください。Docker ドキュメント ↗をご参照ください。

Docker が実行されていることを確認するには、docker info コマンドを実行します。Cannot connect to the Docker daemon と表示される場合は、トラブルシューティングガイド ↗を参照して問題を解決してください。

Docker とは?

Docker はアプリケーションをパッケージ化してデプロイするためのツールです。Docker は、実行環境を問わず一貫性のある実行と、隔離によるセキュリティを提供することで、アプリケーションの簡単な配布を可能にします。これは、コンテナ化 と呼ばれるプロセスによって実現され、アプリケーションの実行に必要なすべてをパッケージ化し、どこにデプロイされても一貫して実行されることを保証します。Docker コンテナ化の 2 つの基本プリミティブは、イメージとコンテナです。

  • イメージ: アプリケーションを実行するために必要なコード、依存関係などを含む不変ファイル。つまり、イメージは実行すべき内容を記述するだけであり、コンテナが作成されるテンプレートです。
  • コンテナ: イメージの単一の実行インスタンス。コンテナは、アプリケーションが実際に実行されるライブで軽量な隔離環境です。

イメージの作成

Docker でイメージを作成するには、アプリケーションとその依存関係、ライブラリ、設定ファイルを単一のポータブルユニットにパッケージ化します。パッケージ化の指示は Dockerfile で定義されます。

Dockerfile

Dockerfile は、アプリケーションの設定と実行方法を指示する一連のコマンドで構成されたテキストドキュメントです。以下のリストは、コンピュートモジュール用のイメージを作成する際に必要となる最も一般的なコマンドの概要です。完全なガイドについては、Dockerfile リファレンスドキュメント ↗をご参照ください。

  • FROM: ベースイメージを宣言します。ベースイメージは、イメージ構成を構築するための基礎レイヤーです。ベースイメージは、最小限(オペレーティングシステムだけ)である場合もあれば、Python などの既存のソフトウェアを含む場合もあります。FROM は Dockerfile の最初のステートメントでなければなりません。ターゲットプラットフォームを指定するために --platform linux/amd64 フラグを追加することもできます。
  • WORKDIR: 作業ディレクトリを設定します。作業ディレクトリは、コマンドが実行されるイメージ内の基本ロケーションです。
  • RUN: イメージビルド中にシェルコマンドを実行します。シェルコマンドは通常、依存関係のインストール、コードのコンパイル、ファイルシステム操作に使用されます。
  • COPY: コンピューターからイメージにファイルをコピーします。
  • USER: コンテナのユーザーを設定します。ユーザーは非 root の数値でなければなりません。
  • ENTRYPOINT: コンテナの起動時に実行されるデフォルトコマンドを設定します。このコマンドは、コンテナが実際に行うことを指定します。
  • EXPOSE: コンテナがリスニングするポートをドキュメント化します。すべての公開ポートは 1024 から 65535 の間でなければなりません。
  • ENV: 環境変数を設定します。これらの変数は、実行中にコンテナが読み取るランタイム情報を設定および提供するために使用されます。

コンピュートモジュールのイメージ要件

  • イメージは非 root の数値ユーザーとして実行されなければなりません。
  • イメージは linux/amd64 プラットフォーム用にビルドされなければなりません。
  • ダイジェストまたは latest 以外の任意のタグを使用する必要があります。
  • すべての公開ポートは 1024 から 65535 の間でなければなりません。

コンピュートモジュールでイメージを使用する

コンピュートモジュールに適したイメージが用意できたら、以下の手順に従って Foundry にアップロードできます。完全な手順については、製作物の公開に関するドキュメントを参照してください。

  • 製作物リポジトリを作成します。
  • Publish に移動し、Docker を選択します。
  • 指示に従ってイメージをリポジトリにプッシュします。

イメージのビルド: 例

コンピュートモジュールとしてデプロイしたいアプリケーションがあり、その構造は次のようになっています。

プロジェクト構造

myapplication
├── Dockerfile         # Dockerの設定ファイル
├── requirements.txt   # 必要なPythonパッケージのリスト
└── src
    └── application.py # メインのアプリケーションコード

以下の手順に従って、1 行ずつ Dockerfile を作成できます。

  1. ベースイメージを指定します。
FROM python:3.12  # ベースイメージとしてPython 3.12を使用
  1. 現在のディレクトリを設定する。
WORKDIR /app
# 作業ディレクトリを /app に設定する
  1. 必要な依存関係をインストールする。
# requirements.txt を /app にコピー
COPY ./requirements.txt /app

# requirements.txt の内容に基づいてパッケージをインストール
# キャッシュを使用せずにインストールすることで、イメージのサイズを小さく保つ
RUN pip install --no-cache-dir -r requirements.txt
  1. コンテナを実行するためのルート以外の数値ユーザーを指定します。
RUN adduser --uid 5001 user
# 新しいユーザー 'user' を UID 5001 で追加
USER 5001
# 実行ユーザーを UID 5001 の 'user' に切り替え
  1. アプリケーションコードをコピーします。これは、Docker イメージレイヤーのキャッシュを活用するために依存関係とは別に行われます。
COPY ./src/application.py /app  # ./src/application.py を /app ディレクトリにコピーする
  1. アプリケーションを起動時に実行するコンテナを指定します。
ENTRYPOINT ["python", "application.py"]

このコードは、Dockerfile内で使用され、Dockerコンテナが起動する際に実行されるデフォルトのコマンドを指定しています。ここでは、python コマンドを使って application.py スクリプトを実行するように設定されています。 ユーザーのDockerfileは次のようになります:

FROM python:3.12
# 作業ディレクトリを /app に設定
WORKDIR /app
# ホストマシンの requirements.txt をコンテナの /app にコピー
COPY ./requirements.txt /app
# 依存関係をインストール(キャッシュを使用しない)
RUN pip install --no-cache-dir -r requirements.txt
# UID 5001 のユーザーを追加
RUN adduser --uid 5001 user
# 実行ユーザーを UID 5001 のユーザーに切り替え
USER 5001
# ホストマシンの src/application.py をコンテナの /app にコピー
COPY ./src/application.py /app
# コンテナ起動時に実行されるコマンド
ENTRYPOINT ["python", "application.py"]

次のコマンドを実行して、Dockerfile から myimage という名前でタグ 0.0.0 のイメージをビルドできます。

docker build . -t myimage:0.0.0 --platform linux/amd64
Copied!
1 2 3 4 # Dockerイメージをビルドするコマンド # 現在のディレクトリにあるDockerfileを使用してビルドを行い、 # 作成したイメージに "myimage:0.0.0" というタグを付ける # ターゲットプラットフォームを "linux/amd64" に指定している

ログ

ログはコンテナレベルで設定でき、各コンテナのログを有効または無効にすることができます。この詳細な制御により、リソースの使用を最適化し、最も関連性の高いログデータに焦点を当てることができます。特定のコンテナのログ設定にアクセスするには、Containersセクションでコンテナの行を選択します。これにより、ログ設定を調整できるサイドパネルが開きます。

ログ形式

SLS形式

SLS形式は一貫性があり、簡単に解析できる構造化されたログ形式です。SLSログは、各ログエントリに追加のメタデータをサポートするように設計されています。

以下は、SLS形式でのログの例です: ログは以下のスタイルと制約に従うことに注意してください。

  • 潜在的に機密性のあるデータには UnsafeArg を使用し、機密性のないデータには SafeArg を使用します。
  • Standard System.out.println() ステートメントは SLS フォーマットではキャプチャされません。

プレーンテキスト形式

プレーンテキスト形式は、特定の構造がない人間が読みやすいログを提供します。プレーンテキストログは直接読みやすいですが、プログラム的に解析するのが難しい場合があります。

プレーンテキストが設定されている場合、出力は SLS ログのメッセージフィールドに挿入されます。これにより、既存の SLS ベースのツールとの互換性を保ちながら、読みやすさも維持されます。

デフォルトとしてプレーンテキストログを使用することで、プレーンテキストと SLS の両方のログがキャプチャされ、SLS ログはメッセージフィールドに JSON 形式で表示されます。

コンテナログソース

コンテナログは 2 つの主要なソースからキャプチャできます。各ソースには、効果的なログ収集を確保するための特定の要件と設定があります。

標準出力

標準出力 (stdout) ソースは、コンテナの標準出力ストリームから直接ログを収集します。このログ方法を有効にするには、コンテナが以下の要件を満たしていることを確認してください。

  • /bin/sh にシェル実行可能ファイルがある必要があります。
  • シェルコマンド settee をサポートする必要があります。

標準エラーの含有: オプションで標準エラー (stderr) をログに含めることができます。true に設定すると、stdoutstderr は同期され、単一のストリームにマージされます。

ログファイル

ログファイルソースは、コンテナ内の特定のファイルからログを収集します。2 つの設定パラメーターがあります。

  • ディレクトリパス: ログファイルが配置されている基本ディレクトリ。
  • ファイルパスパターン: キャプチャするログファイルを一致させるパターン。このパラメーターは、柔軟なファイルマッチングのために一般的なワイルドカードをサポートします。各パターンには指定されたディレクトリパスを含める必要があります。

例: /var/log/foo/ 内のすべての .log ファイルと特定のファイル /var/log/bar.txt からログをキャプチャするには、directoryPath/var/log に設定し、filePathPatterns/var/log/foo/*.log および /var/log/bar.txt に設定します。

ログファイルを使用する場合、計算モジュールが開始されるときに指定されたディレクトリパスが空である必要があります。

環境変数

Docker 環境変数は、Dockerfile やコンテナイメージを変更することなく、Docker コンテナやアプリケーションの動作をカスタマイズできる動的な名前付き値です。環境変数は、次の目的で使用できます。

  • パラメーターを設定する: CPU セットや CPU シェアなどの Docker イメージのパラメーターを設定します。
  • 動作を定義する: アプリケーションやスクリプトの動作を定義します。
  • 資格情報を保存する: API キーやデータベース資格情報などの機密情報を安全に保存します。
  • 再利用可能な設定を作成する: 環境変数と補間を使用して、Docker 化されたアプリケーションの管理と展開を容易にする再利用可能な設定を作成します。
  • デフォルト値を上書きする: コンテナを実行する際に Dockerfile で指定されたデフォルト設定値を上書きします。

productiontest の 2 つのコードパスがあり、test ではリクエストに関する追加のメタデータを返す場合があります。コードを変更して再展開することなく、コードが読み取って異なるパスを実行できる production 環境変数を作成できます。

予約済み環境変数リファレンス

いくつかの環境変数名は予約されています。予約された環境変数は上書きできません。これらは計算モジュールを作成する際に重要な情報を含んでいる可能性があるためです。以下の予約済み環境変数のリストを確認してください。

CLIENT_ID string

  • 存在する場合、これはこの計算モジュールに関連するサードパーティアプリケーションのクライアントIDです。関数実行モードおよびアプリケーション権限を使用する場合に存在します。サードパーティアプリケーションサービスユーザーからFoundryスコープのトークンを取得するために使用します。
  • 例: 038120ac-ac39-4d91-be0e-55afabbb0912 CLIENT_SECRET string
  • これが存在する場合、これはこのコンピュートモジュールに関連付けられたサードパーティアプリケーションのクライアントシークレットです。関数実行モードおよびアプリケーション権限を使用する場合に存在します。サードパーティアプリケーションサービスユーザーからFoundryを利用したトークンを取得するために使用します。
  • 例: 038120ac-ac39-4d91-be0e-55afabbb0912 RUNTIME_HOST host
  • コンピュートモジュールサービスに接続するために使用されるホスト。カスタムクライアントを作成する際に URI を構築するために使用します。
  • 例: localhost RUNTIME_PORT port
  • コンピュートモジュールサービスに接続するために使用されるポート。カスタムクライアントを作成する際に URI を構築するために使用します。
  • 例: 8945 RUNTIME_API hostname
  • 計算モジュールサービスに接続するためのAPIパス。カスタムクライアントを作成するときにURIを構築するために使用します。
  • 例: localhost:8945 GET_JOB_PATH uri path
  • コンピュートモジュールサービスからジョブを取得するために使用されるパス。カスタムクライアントを作成する際にURIを構築するために使用します。
  • 例: /interactive-module/api/internal-query/job GET_JOB_URI uri
  • コンピュートモジュールサービスからジョブを取得するための完全修飾URI。カスタムクライアントを作成する際にURIを構築するために使用します。
  • 例: https://localhost:8945/interactive-module/api/internal-query/job POST_RESULT_PATH uri path
  • コンピュートモジュールサービスから結果を投稿するために使用されるパス。カスタムクライアントを作成する際にURIを構築するために使用します。
  • 例: /interactive-module/api/internal-query/results POST_RESULT_URI uri
  • コンピュートモジュールサービスに結果を投稿するための完全修飾URI。カスタムクライアントを作成するときにURIを構築するために使用します。
  • 例: https://localhost:8945/interactive-module/api/internal-query/results POST_SCHEMA_URI uri
  • コンピュートモジュールサービスにスキーマを投稿するための完全修飾URI。カスタムクライアントを作成するときにURIを構築するために使用します。
  • 例: /interactive-module/api/internal-query/schemas MAX_CONCURRENT_TASKS integer
  • 1 度にレプリカに送信できるタスクの最大数。フロントエンドで設定する。レプリカが実行中にこの値が変更された場合、その変更は適用されない。
  • 使用例: カスタムクライアントを構築する際に初期スレッドプールを設定する。
  • 例: 1 SOURCE_CREDENTIALS ファイルパス
  • 少なくとも 1 つの外部ソースを設定している場合にのみ使用できます。トップレベルのキーがユーザーの設定済み外部ソース API 名であり、値が対応するシークレットのマップである JSON ファイルへのパスです。
  • 例: /opt/source-credentials/SOURCE_CREDENTIALS SOURCE_CONFIGURATIONS_PATH ファイルパス
  • 少なくとも 1 つの外部ソースを設定した場合にのみ利用可能です。これは、トップレベルのキーが設定されたすべての外部ソース API 名であり、値が対応する秘密情報のマップである JSON ファイルへのパスです。このファイルには、設定されたソースに関する追加のメタデータが含まれている場合があります。
  • 例: /opt/source-credentials/SOURCE_CONFIGURATIONS_PATH DEFAULT_CA_PATH file path
  • マウントされた CA PEM ファイルへのパス。コンピュートモジュールサービスに接続する際にこの証明書を使用する必要があります。カスタムクライアントを構築する場合にのみ関連します。
  • 例: /etc/ssl/rubix-ca/ca.pem BUILD2_TOKEN file path
  • パイプライン実行モードでのみ利用可能。入力および出力リソースにスコープされたトークンを含むファイル。APIゲートウェイを呼び出すときに使用します。
  • 例: /opt/build2-token/BUILD2_TOKEN