はい、承知いたしました。Claude APIを利用するコードをDockerコンテナで動かすための詳細な手順を記述した記事を作成します。約5000語の要件を満たすため、関連する概念の説明、ベストプラクティス、高度なトピック、トラブルシューティングなど、幅広く詳細に解説します。
Claude APIを利用するコードをDockerコンテナで動かすための詳細ガイド
はじめに:AIとDockerの強力な組み合わせ
人工知能(AI)技術の進化は目覚ましく、特に大規模言語モデル(LLM)は、自然言語処理、コンテンツ生成、コーディング支援など、様々な分野で革新をもたらしています。Anthropicが開発するClaudeはそのような最先端のLLMの一つであり、APIを通じてその強力な機能を利用できます。
AIモデル自体をローカル環境や特定のサーバーで直接実行することは、高度なハードウェア要件や複雑なセットアップが必要となる場合が多いですが、ClaudeのようなクラウドベースのAPIサービスを利用する場合、必要なのはAPIと通信するためのコードだけです。しかし、そのコードを実行する環境の管理は、プロジェクトの規模が大きくなるにつれて課題となります。
ここで登場するのがDockerです。Dockerは、アプリケーションとその実行に必要なすべての要素(ライブラリ、依存関係、設定ファイルなど)をコンテナという標準化された単位にパッケージ化し、あらゆる環境で一貫して動作させることを可能にするプラットフォームです。開発環境、テスト環境、本番環境など、環境の違いによる「動かない」問題を解消し、開発、デプロイ、運用のプロセスを劇的に効率化します。
AIを利用するアプリケーション開発において、Dockerは特に有用です。AI関連のライブラリは依存関係が複雑になりがちで、特定のバージョンに依存することも少なくありません。また、チーム開発においては、全員が同じ環境で開発できることが重要です。Dockerを使えば、これらの問題を解決し、開発者はAI機能の実装自体に集中できるようになります。
本記事では、「Claude Code」すなわちClaude APIを利用するPythonコードをDockerコンテナ内で実行するための、網羅的かつ詳細な手順を解説します。API呼び出しを行うシンプルなスクリプトの作成から、Dockerイメージの構築、コンテナの実行、さらにはセキュリティ、最適化、トラブルシューティングといった高度なトピックまで、ステップバイステップで掘り下げていきます。
この記事を読むことで、以下のことが可能になります。
- Claude APIを利用する基本的なPythonコードを作成する。
- そのコードと依存関係を含むDockerイメージを構築する。
- 構築したDockerイメージからコンテナを起動し、Claude APIと安全に通信させる。
- Dockerを使った開発におけるベストプラクティスと、潜在的な課題への対処方法を理解する。
AI開発の効率化と信頼性向上を目指すすべての開発者にとって、本記事が役立つ一歩となることを願っています。
第1章:Claude APIとDockerの基礎理解
本題に入る前に、Claude APIの利用方法とDockerの基本概念について理解を深めましょう。
1.1 Claude APIとは?
Claudeは、Anthropicが提供する大規模言語モデルです。人間のように自然な会話を理解し、応答を生成する能力に優れています。要約、翻訳、質問応答、クリエイティブな文章作成、コーディング支援など、多岐にわたるタスクを実行できます。
Claudeの最も一般的な利用方法は、RESTful APIを経由することです。開発者はHTTPリクエストを送信することで、Claudeモデルにアクセスし、テキストプロンプトを与えて応答を受け取ることができます。APIを利用するためには、Anthropicから発行されるAPIキーが必要です。このAPIキーは、認証と課金の識別に使われるため、厳重に管理する必要があります。
Claude APIを利用するコードを書く場合、通常は専用のクライアントライブラリ(例: Python向けのanthropic
ライブラリ)を使用します。これにより、HTTPリクエストの詳細を意識することなく、より直感的にAPIを操作できます。
1.2 Dockerとは?
Dockerは、アプリケーションとその依存関係をコンテナにパッケージ化し、どの環境でも同じように実行できるようにするオープンソースプラットフォームです。コンテナは、軽量でポータブルな自己完結型の実行環境です。
Dockerの主要なコンポーネントは以下の通りです。
- Dockerfile: コンテナイメージを構築するための手順を記述したテキストファイルです。どのベースイメージを使うか、どのファイルをコピーするか、どの依存関係をインストールするか、どのコマンドを実行するかなどを指示します。
- Docker Image: Dockerfileの指示に基づいて構築される、コンテナの設計図となる読み取り専用のテンプレートです。アプリケーションのコード、ライブラリ、設定などが含まれます。イメージはレイヤー構造になっており、変更があった部分だけが新しいレイヤーとして追加されるため、効率的に管理できます。
- Docker Container: Dockerイメージから起動される、分離された実行環境です。イメージは静的な設計図であるのに対し、コンテナは動的なインスタンスです。コンテナ内でアプリケーションが実行され、ファイルシステムの変更、ネットワーク通信、プロセスの実行などが行われます。
- Docker Engine: Dockerのデーモン(バックグラウンドプロセス)で、Dockerオブジェクト(イメージ、コンテナ、ボリューム、ネットワークなど)を管理します。CLIコマンド(
docker build
,docker run
など)はこのEngineと通信して処理を実行します。 - Docker Registry: Dockerイメージを保存・共有するためのサービスです。Docker Hubが最も有名ですが、プライベートなレジストリを構築することも可能です。
1.3 なぜClaude APIコードとDockerを組み合わせるのか?
Claude API自体はクラウドサービスであり、Dockerコンテナ内でモデルが直接実行されるわけではありません。しかし、Claude APIを利用するアプリケーションをDockerコンテナで実行することには、多くのメリットがあります。
- 環境の標準化と分離: Claude APIを利用するコードは、特定のプログラミング言語(例: Python)と、その言語の特定のライブラリ(例:
anthropic
)に依存します。これらの依存関係や言語バージョンを、開発者全員が同じようにインストールし、管理するのは手間がかかります。Dockerを使えば、必要な環境をDockerfileに記述し、イメージとしてパッケージ化できます。このイメージを使えば、誰でもホスト環境に影響を与えることなく、独立したコンテナ内でアプリケーションを実行できます。 - 依存関係の管理:
requirements.txt
のようなファイルに必要なライブラリを記述し、Dockerfile内でこれらをインストールする手順を含めることで、アプリケーション実行に必要なすべての依存関係がコンテナ内に閉じ込められます。ホストマシンのPython環境やライブラリのバージョンに左右されません。 - 再現性: Dockerイメージは、アプリケーションとその実行環境のスナップショットのようなものです。同じDockerfileから構築されたイメージを使えば、異なるマシンや異なる時期でも、常に同じ環境でアプリケーションを実行できます。これにより、「私の環境では動くのに…」といった問題を排除し、再現性の高い開発・テスト・デプロイが可能になります。
- ポータビリティ: Dockerイメージは様々なDocker互換環境(ローカルマシン、クラウドVM、コンテナオーケストレーションプラットフォームなど)で実行できます。開発したアプリケーションを、最小限の変更でどこへでもデプロイできます。
- デプロイの容易さ: CI/CDパイプラインにDockerイメージのビルドを含めることで、アプリケーションの新しいバージョンを自動的にビルドし、テストし、デプロイするプロセスを効率化できます。
- セキュリティ: APIキーのような機密情報を、ホスト環境に直接置くのではなく、Dockerの提供する安全な方法(環境変数、Docker Secretsなど)でコンテナに渡すことができます。これにより、ホストファイルシステムからの情報漏洩リスクを低減できます。
これらの理由から、Claude APIを利用するアプリケーションをDockerコンテナで実行することは、現代のソフトウェア開発における強力なプラクティスと言えます。
第2章:事前準備と環境設定
DockerコンテナでClaude APIコードを実行するために必要な準備を行います。
2.1 Dockerのインストール
まず、お使いのオペレーティングシステムにDockerをインストールする必要があります。Docker Desktop(Windows/macOS)またはDocker Engine(Linux)をインストールしてください。
- Windows & macOS: Docker Desktopの公式サイトからインストーラーをダウンロードして実行します。
- Linux: 各ディストリビューション向けのパッケージマネージャーを使ったインストール手順が公式サイトに記載されています。
インストール後、ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行してDockerが正しくインストールされ、実行されているか確認します。
bash
docker --version
docker run hello-world
docker --version
でバージョン情報が表示され、docker run hello-world
が正常に完了すれば、Dockerのインストールは成功です。
2.2 Anthropic APIキーの取得
Claude APIを利用するには、AnthropicからAPIキーを取得する必要があります。Anthropicの公式サイトにアクセスし、アカウントを作成またはログインして、APIキー発行の手順に従ってください。
APIキーは非常に機密性の高い情報です。絶対に公開リポジトリにコミットしたり、平文でファイルに保存したりしないでください。後述する環境変数を使って安全にコンテナに渡す方法を説明します。
APIキーを取得したら、それを安全な場所に控えておいてください。環境変数として設定する場合、キーの名前は通常 ANTHROPIC_API_KEY
となります。
2.3 開発環境の準備
Claude APIと通信するコードを作成するために、お好みのプログラミング言語とエディタ、そしてAPIクライアントライブラリが必要です。本記事ではPythonを使用します。
- Python: 3.7以上のバージョンを推奨します。公式サイトからインストーラーをダウンロードするか、OSのパッケージマネージャーやpyenvなどのツールを使用してインストールできます。
- pip: Pythonのパッケージインストーラー。Pythonインストール時に通常含まれています。
-
anthropic ライブラリ: Claude APIとPythonからやり取りするための公式ライブラリです。以下のコマンドでインストールできます。
bash
pip install anthropic -
テキストエディタまたはIDE: VS Code, PyCharm, Atom, Sublime Textなど、使い慣れたエディタを用意してください。
- コマンドラインインターフェース: ターミナルまたはコマンドプロンプト。
これらのツールが準備できたら、コードを記述し、Dockerfileを作成するための準備が完了です。
第3章:Claude APIを利用するPythonコードの作成
Dockerコンテナ内で実行する、Claude APIと通信するシンプルなPythonスクリプトを作成します。このスクリプトは、指定されたプロンプトに対するClaudeの応答を取得し、表示する機能を持つとします。
3.1 プロジェクトディレクトリの作成
まず、プロジェクトのルートディレクトリを作成します。
bash
mkdir claude-docker-example
cd claude-docker-example
このディレクトリ内に、必要なファイルを配置していきます。
3.2 Pythonスクリプトの作成 (app.py
)
app.py
という名前でPythonスクリプトファイルを作成します。
“`python
app.py
import os
import sys
import anthropic
環境変数からAPIキーを取得
ANTHROPIC_API_KEYという名前がSDKのデフォルトで推奨されています
api_key = os.environ.get(“ANTHROPIC_API_KEY”)
if not api_key:
print(“エラー: 環境変数 ‘ANTHROPIC_API_KEY’ が設定されていません。”, file=sys.stderr)
print(“APIキーを設定して再実行してください。”, file=sys.stderr)
sys.exit(1) # エラーコードで終了
Anthropicクライアントを初期化
client = anthropic.Anthropic(
api_key=api_key,
)
def get_claude_response(prompt_text: str):
“””
Claude APIを呼び出して応答を取得する関数
Args:
prompt_text: Claudeに送信するプロンプト文字列
Returns:
Claudeからの応答テキスト、またはエラー時はNone
"""
try:
print(f"プロンプトを送信中:\n---\n{prompt_text}\n---\n")
message = client.messages.create(
model="claude-3-opus-20240229", # またはclaude-3-sonnet-20240229, claude-3-haiku-20240229など
max_tokens=1000,
messages=[
{"role": "user", "content": prompt_text}
]
)
response_text = ""
for block in message.content:
if block.type == "text":
response_text += block.text
return response_text
except anthropic.APIConnectionError as e:
print(f"API接続エラーが発生しました: {e}", file=sys.stderr)
return None
except anthropic.RateLimitError as e:
print(f"レート制限エラーが発生しました: {e}", file=sys.stderr)
print("しばらく待ってから再試行してください。", file=sys.stderr)
return None
except anthropic.AuthenticationError as e:
print(f"認証エラーが発生しました: {e}", file=sys.stderr)
print("APIキーが正しいか、有効期限が切れていないか確認してください。", file=sys.stderr)
return None
except anthropic.APIStatusError as e:
print(f"APIステータスエラーが発生しました: {e.status_code}", file=sys.stderr)
print(f"応答内容: {e.response}", file=sys.stderr)
return None
except Exception as e:
print(f"予期しないエラーが発生しました: {e}", file=sys.stderr)
return None
if name == “main“:
# コマンドライン引数からプロンプトを取得、なければデフォルトを使用
if len(sys.argv) > 1:
user_prompt = sys.argv[1]
else:
user_prompt = “Dockerについて、初心者にもわかるように簡潔に説明してください。”
print("Claude APIを呼び出します...")
claude_response = get_claude_response(user_prompt)
if claude_response:
print("\n--- Claudeからの応答 ---")
print(claude_response)
print("------------------------")
else:
print("\nClaudeからの応答を取得できませんでした。", file=sys.stderr)
sys.exit(1) # 応答取得失敗時もエラーコードで終了
sys.exit(0) # 正常終了
“`
コードの説明
import os, sys, anthropic
: 必要なライブラリをインポートします。os
は環境変数、sys
はスクリプトの終了コードや標準エラー出力、anthropic
はClaude APIクライアント用です。api_key = os.environ.get("ANTHROPIC_API_KEY")
: 最も重要です。APIキーをハードコードせず、実行環境の環境変数から取得します。これにより、コードと機密情報を分離できます。if not api_key: ...
: APIキーが設定されていない場合にエラーメッセージを表示し、スクリプトを終了します。client = anthropic.Anthropic(api_key=api_key)
: 取得したAPIキーを使ってAnthropicクライアントを初期化します。get_claude_response(prompt_text)
関数:- この関数がClaude APIへの実際の呼び出しを行います。
client.messages.create(...)
がSDKを使ってAPIにリクエストを送る部分です。model
: 使用するClaudeモデルを指定します。利用可能なモデルはAnthropicのドキュメントを確認してください(例:claude-3-opus-20240229
,claude-3-sonnet-20240229
,claude-3-haiku-20240229
)。max_tokens
: 応答の最大トークン数を指定します。messages
: 会話履歴をリスト形式で渡します。シンプルな質疑応答の場合は、ユーザーの発言を一つだけ含めます。{"role": "user", "content": prompt_text}
の形式です。- エラーハンドリングとして、
try...except
ブロックでAPI呼び出し中に発生しうる様々なエラー(接続エラー、レート制限、認証エラーなど)を捕捉し、適切なメッセージを表示します。 - 応答は
message.content
にリストとして格納されるため、それを結合してテキスト形式で返します。
if __name__ == "__main__": ...
: スクリプトが直接実行された場合に実行されるブロックです。sys.argv
を使ってコマンドライン引数からプロンプトを取得できるようにしています。引数がない場合はデフォルトのプロンプトを使用します。get_claude_response
関数を呼び出し、結果を表示します。- 正常終了またはエラー終了を示す終了コード (
sys.exit(0)
またはsys.exit(1)
) を設定しています。これはDockerのような自動化された環境でスクリプトの成否を判断するのに役立ちます。
3.3 依存関係ファイルの作成 (requirements.txt
)
このスクリプトが依存しているライブラリを記述したファイルを作成します。
“`bash
requirements.txt
anthropic
“`
これは非常にシンプルですが、実際のプロジェクトでは、必要な全てのライブラリとそのバージョン(推奨)を記述します。
“`bash
例: 特定のバージョンを指定する場合
anthropic==0.25.3
requests==2.31.0
…その他のライブラリ
“`
プロジェクトディレクトリの構造は以下のようになります。
claude-docker-example/
├── app.py
└── requirements.txt
この時点で、ホスト環境にanthropic
ライブラリがインストールされていれば、環境変数ANTHROPIC_API_KEY
を設定してスクリプトを直接実行してみることも可能です。
“`bash
ホスト環境で一時的にAPIキーを設定して実行 (bash/zshの場合)
export ANTHROPIC_API_KEY=’YOUR_ANTHROPIC_API_KEY’
python app.py “犬と猫の違いについて説明してください。”
または引数なしでデフォルトプロンプトを実行
python app.py
Windows Command Promptの場合
set ANTHROPIC_API_KEY=YOUR_ANTHROPIC_API_KEY
python app.py “犬と猫の違いについて説明してください。”
Windows PowerShellの場合
$env:ANTHROPIC_API_KEY=”YOUR_ANTHROPIC_API_KEY”
python app.py “犬と猫の違いについて説明してください。”
“`
ただし、この記事の目的はこれをDockerで実行することなので、確認は必須ではありません。このコードとrequirements.txt
を基に、次にDockerイメージを作成します。
第4章:Dockerfileの作成と解説
Dockerイメージを構築するための指示書であるDockerfileを作成します。プロジェクトのルートディレクトリ(claude-docker-example
)にDockerfile
という名前でファイルを作成します。
“`dockerfile
Dockerfile
1. ベースイメージの指定
Python実行環境を含む公式の軽量なイメージを選択
Alpineは非常に小さいため、最終的なイメージサイズを抑えたい場合に適しています
FROM python:3.9-alpine
2. 作業ディレクトリの設定
コンテナ内部でアプリケーションのファイルが配置されるディレクトリを設定
WORKDIR /app
3. 必要なファイルをコンテナイメージにコピー
ローカルのrequirements.txtを作業ディレクトリにコピー
COPY requirements.txt .
4. 依存関係のインストール
コピーしたrequirements.txtを使ってPythonライブラリをインストール
–no-cache-dir: キャッシュディレクトリを使わない (イメージサイズ削減)
–upgrade pip: pip自体を最新に更新
RUN pip install –no-cache-dir –upgrade pip && \
pip install –no-cache-dir -r requirements.txt
5. アプリケーションコードをコンテナイメージにコピー
ローカルのapp.pyを作業ディレクトリにコピー
NOTE: COPY . . とすればrequirements.txtとapp.pyをまとめてコピーできますが、
依存関係インストールの前にrequirements.txtだけをコピーする方が、
requirements.txtが変更されない限り、依存関係インストール層のキャッシュが効きやすくなります。
COPY app.py .
6. コンテナが起動したときに実行されるコマンドの設定
このイメージからコンテナを作成・起動した際に自動的に実行されるコマンドを指定
この例では、app.pyスクリプトを実行します。
環境変数 ANTHROPIC_API_KEY はコンテナ実行時に外部から渡します。
CMD [“python”, “app.py”]
CMDを使うと、docker run my-image “arg1 arg2” のように引数を上書きできます。
ENTRYPOINTを使うと、引数をコマンドに追加する形になります。
今回はコマンドライン引数でプロンプトを渡せるようにCMDを採用します。
CMD [“python”, “app.py”]
参考:もし ENTRYPOINT を使うなら以下のようになります。
ENTRYPOINT [“python”, “app.py”]
これで docker run my-image “あなたのプロンプト” とすると、
python app.py “あなたのプロンプト” が実行されます。
CMD [“Dockerについて”] # ENTRYPOINTとCMDを併用する場合、CMDはデフォルト引数になります
docker run my-image # -> python app.py Dockerについて
docker run my-image “AIについて” # -> python app.py AIについて (CMDは上書きされる)
“`
Dockerfileの詳細解説
Dockerfileは、上から順番に実行される命令のリストです。各命令について詳しく見ていきましょう。
-
FROM python:3.9-alpine
:- これはDockerfileの最初の命令である必要があります。
- このイメージを構築するためのベースイメージを指定します。ベースイメージには、OSや特定の実行環境(この場合はPython 3.9)が含まれています。
python:3.9-alpine
は、Pythonの公式イメージの中でも、軽量なLinuxディストリビューションであるAlpine Linuxをベースにしたタグです。これにより、最終的なDockerイメージのサイズを小さく保つことができます。- 他にも
python:3.9
(Debianベース、やや大きい)、python:3.9-slim
(Debianベースの軽量版)など、様々なタグがあります。用途や必要に応じて適切なベースイメージを選択します。
-
WORKDIR /app
:- 以降の
RUN
,COPY
,CMD
,ENTRYPOINT
などの命令が実行される現在の作業ディレクトリを設定します。 - これにより、ファイルパスを絶対パスではなく相対パスで指定できるようになり、Dockerfileが読みやすくなります。
/app
というディレクトリがコンテナ内に存在しない場合、この命令によって自動的に作成されます。
- 以降の
-
COPY requirements.txt .
:- ホストマシン上のファイルを、コンテナイメージ内の現在の作業ディレクトリ(
WORKDIR
で指定した/app
)にコピーします。 requirements.txt
というファイル名を指定することで、ローカルの./requirements.txt
がコンテナの/app/requirements.txt
にコピーされます。COPY <ソースパス> <デスティネーションパス>
という形式です。ソースパスはDockerfileからの相対パス、デスティネーションパスはWORKDIR
からの相対パス(.
は現在の作業ディレクトリ)です。
- ホストマシン上のファイルを、コンテナイメージ内の現在の作業ディレクトリ(
-
RUN pip install --no-cache-dir --upgrade pip && pip install --no-cache-dir -r requirements.txt
:- コンテナイメージのビルド時に実行されるコマンドを指定します。
- ここでは、Pythonの依存関係をインストールしています。
pip install --no-cache-dir --upgrade pip
: pip自体を最新バージョンにアップグレードします。--no-cache-dir
オプションは、パッケージインストール時のキャッシュを保存しないように指示します。これにより、イメージサイズをわずかに削減できます。&&
: 複数のコマンドを連結して1つのRUN
命令として実行しています。これにより、中間イメージレイヤーの数を減らし、イメージサイズとビルド時間を最適化できます。pip install --no-cache-dir -r requirements.txt
:requirements.txt
ファイルにリストされているすべてのパッケージをインストールします。これも--no-cache-dir
オプションを使用しています。- この
RUN
命令は、COPY requirements.txt .
命令の後に配置することが重要です。Dockerは各命令をレイヤーとしてキャッシュします。requirements.txt
が変更されない限り、このRUN
命令のレイヤーはキャッシュから再利用されるため、イメージの再ビルドが高速になります。app.py
の変更は頻繁でも、requirements.txt
の変更はそれほど頻繁ではないため、このように分けて記述することでビルドキャッシュの恩恵を受けやすくなります(Dockerfileのベストプラクティスの一つです)。
-
COPY app.py .
:- ホストマシン上の
app.py
ファイルを、コンテナイメージ内の作業ディレクトリ/app
にコピーします。
- ホストマシン上の
-
CMD ["python", "app.py"]
:- このDockerイメージからコンテナが起動したときにデフォルトで実行されるコマンドを指定します。
- この例では、コンテナが起動すると
python app.py
というコマンドが実行されます。 - 角括弧で囲まれた形式(Exec形式)が推奨されます。これはシェルを介さずに直接コマンドを実行するため、環境変数の扱いなどがより予測可能になります。
CMD python app.py
のように文字列形式で書くこともできますが、その場合は/bin/sh -c "python app.py"
のようにシェルを介して実行されます。 CMD
命令は、docker run <image>
のように引数なしでコンテナを起動したときに実行されます。docker run <image> <some command>
のようにコマンドを付けて起動した場合、DockerfileのCMD
は上書きされます。今回のapp.py
はコマンドライン引数をプロンプトとして受け取るため、docker run my-image "あなたのプロンプト"
とすることで、デフォルトのCMD
であるpython app.py
が、python app.py "あなたのプロンプト"
に上書きされて実行されることになります。
これでDockerfileの作成と解説は終わりです。次にこのDockerfileを使ってDockerイメージをビルドします。
第5章:Dockerイメージの構築
Dockerfileとアプリケーションコード、依存関係ファイルが準備できたので、これらを使ってDockerイメージを構築します。
プロジェクトのルートディレクトリ(claude-docker-example
)にいることを確認してください。ここにDockerfile
, app.py
, requirements.txt
があるはずです。
ターミナルを開き、以下のコマンドを実行します。
bash
docker build -t claude-api-app .
コマンドの説明
docker build
: Dockerイメージを構築するためのコマンドです。-t claude-api-app
: 構築するイメージにタグ(名前とオプションでバージョン)を付けます。-t <イメージ名>:<タグ>
の形式です。タグを省略した場合、デフォルトで:latest
が付きます。ここではclaude-api-app
という名前を付けました。.
: Dockerfileがある場所(ビルドコンテキスト)を指定します。.
は現在のディレクトリを意味します。docker build
コマンドはこのビルドコンテキスト内のファイルをDockerデーモンに送信し、Dockerfileの指示に従ってイメージを構築します。
ビルドプロセスの確認
コマンドを実行すると、DockerはDockerfileを読み込み、ステップバイステップでイメージを構築します。ターミナルには以下のような出力が表示されます(詳細は異なる場合があります)。
“`
[+] Building 7.0s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> [internal] load .dockerignore 0.0s
=> [internal] load metadata for docker.io/library/python:3.9-alpine 1.8s
=> [1/4] FROM docker.io/library/python:3.9-alpine@sha256:… 1.9s
=> [internal] load build context 0.0s
=> [2/4] WORKDIR /app 0.1s
=> [3/4] COPY requirements.txt . 0.0s
=> [4/4] RUN pip install –no-cache-dir –upgrade pip && pip install –no-cache-dir -r requirements.txt 3.0s
=> [5/4] COPY app.py . 0.0s
=> [6/4] CMD [“python”, “app.py”] 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:… 0.0s
=> => naming to docker.io/library/claude-api-app:latest 0.0s
What’s Next?
View a summary of image vulnerabilities and recommendations…
“`
出力には、Dockerfileの各ステップ(FROM
, WORKDIR
, COPY
, RUN
など)が実行されている様子が表示されます。=>
で始まる各行がDockerfileの1命令に対応し、その実行時間などが表示されます。Dockerは各ステップの結果を中間レイヤーとしてキャッシュするため、2回目以降のビルドでは、変更がないステップは非常に高速に完了します(Using cache
と表示されます)。
ビルドが正常に完了すると、末尾にイメージ名とタグが表示されます。
構築されたイメージの確認
以下のコマンドを実行すると、ローカルに保存されているDockerイメージのリストを確認できます。
bash
docker images
出力の中に、先ほど構築したclaude-api-app
という名前のイメージがあるはずです。
REPOSITORY TAG IMAGE ID CREATED SIZE
claude-api-app latest [イメージID] About a minute ago ~50MB (alpineベースの場合)
python 3.9-alpine [イメージID] 3 weeks ago ~24MB
hello-world latest [イメージID] 2 months ago 9.14kB
SIZE
列はイメージのサイズを示します。AlpineベースのPythonイメージは非常に小さいため、依存関係をインストールしても数十MB程度に収まることが多いです。
これで、Claude APIと通信するPythonコードを含むDockerイメージの構築が完了しました。次に、このイメージを使ってコンテナを起動します。
第6章:Dockerコンテナの実行
構築したclaude-api-app
イメージからDockerコンテナを起動し、アプリケーションを実行します。Claude APIとの通信にはAPIキーが必要ですが、イメージ自体にAPIキーは含まれていません。安全にコンテナにAPIキーを渡す必要があります。
6.1 APIキーを環境変数として渡す
Dockerコンテナに機密情報を渡す最も一般的な方法の一つは、環境変数を使用することです。docker run
コマンドの-e
オプションを使って、ホストの環境変数や直接指定した値をコンテナの環境変数として設定できます。
重要な注意点: 環境変数はコンテナ内でプロセスから容易にアクセスできます。したがって、APIキーのような機密情報を渡す場合、そのコンテナが安全な環境で実行されていることを確認し、不要になったコンテナは速やかに停止・削除することが推奨されます。本番環境では、Docker SecretsやKubernetes Secrets、HashiCorp Vaultなどのより高度なシークレット管理システムを使用することを検討してください。しかし、開発やテスト用途では環境変数は手軽でよく利用されます。
環境変数ANTHROPIC_API_KEY
にAPIキーを設定済みであれば、以下のコマンドでコンテナを実行できます(ホスト側の環境変数をコンテナに引き渡す)。
“`bash
bash/zshなどの場合
まずホストでAPIキーを設定 (例: ~/.bashrc, ~/.zshrc などに追記して source するか、一時的にexport)
export ANTHROPIC_API_KEY=’YOUR_ANTHROPIC_API_KEY’
そしてコンテナを実行
docker run -e ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} –rm claude-api-app
“`
APIキーを直接コマンドラインで渡すことも可能ですが、シェルの履歴に残る可能性があるため、この方法は非推奨です。もし一時的にコマンドラインで渡す必要がある場合は、以下のようにします。
“`bash
非推奨だが方法として紹介
docker run -e ANTHROPIC_API_KEY=’YOUR_ANTHROPIC_API_KEY’ –rm claude-api-app
“`
推奨されるのは、ホストの環境変数として設定しておき、それを-e
オプションで参照して渡す方法です。
-e ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
:-e <コンテナ変数名>=<値>
または-e <コンテナ変数名>=<ホスト環境変数>
の形式です。- ここでは、コンテナ内の環境変数
ANTHROPIC_API_KEY
に、ホストの環境変数ANTHROPIC_API_KEY
の値($ANTHROPIC_API_KEY
または${ANTHROPIC_API_KEY}
で参照)を渡しています。
--rm
:- コンテナの実行が終了したときに、そのコンテナを自動的に削除します。これにより、使い捨てのタスクを実行する際に、停止したコンテナがシステムに残ってしまうのを防ぎ、ディスク容量を節約できます。開発・テスト時には非常に便利です。
claude-api-app
:- 実行するDockerイメージの名前を指定します。タグを指定しない場合は
:latest
が使用されます。
- 実行するDockerイメージの名前を指定します。タグを指定しない場合は
このコマンドを実行すると、以下の処理が行われます。
claude-api-app:latest
イメージが見つかるかローカルで探す。- 見つかれば、そのイメージから新しいコンテナインスタンスを作成する。
-e
オプションで指定された環境変数ANTHROPIC_API_KEY
をコンテナ内に設定する。- コンテナ内で、Dockerfileの
CMD ["python", "app.py"]
で指定されたコマンドが実行される。 app.py
スクリプトが起動し、環境変数からAPIキーを読み込む。- Claude APIへの呼び出しが行われる。
- APIからの応答が標準出力に表示される。
- スクリプトが終了し、コンテナが停止する。
--rm
オプションにより、停止したコンテナが自動的に削除される。
デフォルト以外のプロンプトで実行
app.py
はコマンドライン引数をプロンプトとして受け取るように記述されています。docker run
コマンドの最後に引数を追加することで、DockerfileのCMD
を上書きし、異なるプロンプトで実行できます。
“`bash
bash/zshの場合 (ホスト環境でAPIキー設定済みを前提)
export ANTHROPIC_API_KEY=’YOUR_ANTHROPIC_API_KEY’ # 必要であれば
docker run -e ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} –rm claude-api-app “今日の天気について教えてください。”
“`
このコマンドを実行すると、コンテナ内でpython app.py "今日の天気について教えてください。"
が実行され、そのプロンプトに対するClaudeの応答が表示されます。
コンテナのライフサイクル管理
開発やデバッグのために、コンテナを起動したままにしておきたい場合や、後でログを確認したい場合があります。その場合は--rm
オプションを付けずに実行し、docker stop
やdocker start
、docker logs
などのコマンドを使用します。コンテナに名前を付けておくと管理しやすくなります。
“`bash
APIキーを設定 (bash/zsh)
export ANTHROPIC_API_KEY=’YOUR_ANTHROPIC_API_KEY’
コンテナ名を付けてバックグラウンドで実行 (-d はデタッチドモード)
docker run -d –name my-claude-app -e ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} claude-api-app “これはテストプロンプトです。”
実行中のコンテナを確認
docker ps
コンテナのログを確認
docker logs my-claude-app
コンテナを停止
docker stop my-claude-app
停止したコンテナを含め、全てのコンテナを確認 (-a は all)
docker ps -a
コンテナを削除
docker rm my-claude-app
“`
このように、Dockerコマンドを組み合わせてコンテナのライフサイクルを管理できます。
第7章:高度なトピックとベストプラクティス
DockerとClaude APIコードの組み合わせをより効果的に、かつ安全に利用するための高度なトピックとベストプラクティスについて説明します。
7.1 APIキーのセキュリティ
前述の通り、APIキーは非常に機密性の高い情報です。環境変数で渡す方法は開発やテストには便利ですが、本番環境ではさらなる対策を検討すべきです。
- Docker Secrets: Docker SwarmやKubernetesといったコンテナオーケストレーションツールを使用している場合、シークレット管理機能が提供されています。これにより、機密情報を暗号化して保存し、必要なコンテナにのみ安全に配布できます。
docker-compose
でもバージョン3.1以降でSecretsがサポートされています。 - 外部シークレット管理システム: HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, Google Secret Managerなど、専用のシークレット管理システムを利用することも一般的です。アプリケーションはこれらのシステムから実行時にAPIキーを取得します。
- IAMロール/サービスアカウント: クラウドプラットフォーム上でコンテナを実行する場合、IAMロールやサービスアカウントをコンテナに割り当て、その権限でClaude APIにアクセスする方法が最も安全です。アプリケーションコードはAPIキーを直接扱う必要がなくなります。Anthropic APIがこれをサポートしているか確認し、可能であれば採用を検討してください。
絶対に避けるべきこと:
- DockerfileやアプリケーションコードにAPIキーを直接ハードコードする。
- イメージ内にAPIキーをファイルとして含める。
- コミット履歴にAPIキーを含める。
- 公開リポジトリにAPIキーを含むファイルをアップロードする。
環境変数を使用する場合でも、コンテナのログにAPIキーが表示されないように注意が必要です(今回のサンプルコードでは標準エラー出力にキーを表示しないようにしています)。
7.2 Dockerイメージの最適化
より小さく、より高速にビルドできるDockerイメージを作成するためのテクニックです。
-
.dockerignore
ファイルの利用: プロジェクトディレクトリには、イメージに含める必要のないファイル(例:.git
,__pycache__
, エディタの一時ファイルなど)が多数存在します。.dockerignore
ファイルを作成し、これらのファイルを記述することで、docker build
時にDockerデーモンに送信されるビルドコンテキストから除外できます。これにより、ビルド時間の短縮、ビルドコンテキストサイズの削減、およびイメージサイズの削減につながります。“`bash
.dockerignore
.git
pycache
.pyc
.log
.vscode/
venv/
dist/
“` -
ベースイメージの選択: 前述の通り、
alpine
ベースのイメージは非常に軽量です。アプリケーションの要件を満たす限り、より小さなベースイメージを選択することで、最終的なイメージサイズを大幅に削減できます。イメージサイズが小さいほど、ビルド、プッシュ、プル、デプロイが高速になります。 - レイヤーの活用と最適化: DockerはDockerfileの各命令を個別のレイヤーとしてキャッシュします。変更の頻繁な命令(例:
COPY app.py .
)は、変更の少ない命令(例:RUN pip install -r requirements.txt
)よりも後に配置することで、ビルドキャッシュをより有効に活用できます。また、複数のRUN
命令を&&
で連結し、1つのレイヤーにまとめることで、レイヤー数を減らし、イメージサイズを最適化できます。 - マルチステージビルド: 複雑なアプリケーションでは、ビルドに必要なツール(コンパイラ、テストフレームワークなど)と、実行に必要な環境が異なる場合があります。マルチステージビルドを使用すると、最初のステージでビルドを行い、生成された成果物だけを、より軽量な最終ステージのイメージにコピーできます。これにより、最終イメージに不要なビルドツールなどが含まれるのを防ぎ、サイズを劇的に小さくできます。今回のシンプルなPythonスクリプトでは不要ですが、例えばGoやJavaアプリケーションをDocker化する際には非常に有効です。
7.3 依存関係管理
requirements.txt
は最も基本的な依存関係管理方法ですが、大規模なプロジェクトではPoetryやPipenvといったツールを使用することも検討できます。これらのツールは依存関係の解決や仮想環境の管理をより洗練された方法で行います。Dockerfile内でこれらのツールを使って依存関係をインストールすることも可能です。
7.4 CI/CDへの組み込み
DockerはCI/CDパイプラインと非常に相性が良いです。
- ビルド: コードが変更されるたびに、CIシステム(Jenkins, GitLab CI, GitHub Actions, CircleCIなど)上で
docker build
コマンドを実行し、新しいDockerイメージを自動的に構築します。 - テスト: 構築したイメージを使ってコンテナを起動し、単体テストや結合テストを実行します。Claude APIを利用する部分のテストには、モック化やテスト用のAPIキーの使用が必要になる場合があります。
- プッシュ: テストに合格したイメージをDocker Registry(Docker Hub, AWS ECR, Google GCRなど)にプッシュします。
- デプロイ: Registryにプッシュされたイメージを、本番環境のサーバーやコンテナオーケストレーションプラットフォーム(Kubernetes, Docker Swarm, AWS ECS, Azure AKSなど)にデプロイします。
これにより、コード変更から本番環境への反映までのプロセスを自動化し、迅速かつ信頼性の高いリリースを実現できます。
7.5 オーケストレーション
単一のコンテナでAIタスクを実行するだけでなく、複数のコンテナを連携させたり、コンテナのスケーリングや可用性を管理したりする必要が出てくるかもしれません。
- Docker Compose: 複数のコンテナで構成されるアプリケーション(例: アプリケーション、データベース、キャッシュなど)を定義・管理するためのツールです。YAMLファイルにサービス構成を記述し、
docker-compose up
コマンド一つでまとめて起動・停止できます。今回の例に直接は関係ありませんが、例えばClaude APIを使って生成したデータをデータベースに保存するようなアプリケーションの場合、アプリケーションコンテナとデータベースコンテナをDocker Composeで管理することが考えられます。 - Kubernetes / Docker Swarm: 大規模なコンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのプラットフォームです。高い可用性や負荷に応じた自動スケーリング機能を提供します。本番環境でClaude APIを利用するサービスを高負荷に耐えられるように運用する場合に検討する価値があります。
第8章:トラブルシューティング
DockerコンテナでClaude APIコードを実行する際に遭遇しうる一般的な問題とその解決策について説明します。
8.1 Dockerビルド時のエラー
COPY
元のファイルが見つからない:COPY
命令で指定したファイルがDockerfileと同じディレクトリ(または指定したビルドコンテキスト)に存在するか確認してください。ファイル名やパスのスペルミスがないかチェックしてください。RUN
コマンドの失敗:RUN
命令で実行しているコマンド(例:pip install
)が失敗していないか、出力ログを詳細に確認してください。インターネット接続の問題、依存関係のバージョン競合、requirements.txt
の記述ミスなどが考えられます。ローカル環境で同じコマンドを実行して、問題なく完了するか試してみるのも有効です。- Dockerfileの文法エラー: Dockerfileの命令名や引数の区切りなどに間違いがないか確認してください。
docker build
は文法エラーがあれば早い段階で検知して教えてくれます。
8.2 コンテナ実行時のエラー
ANTHROPIC_API_KEY
が設定されていない (AuthenticationError
):app.py
が環境変数からAPIキーを取得できない場合に発生します。docker run -e ANTHROPIC_API_KEY=...
オプションを正しく指定しているか確認してください。- ホスト側で環境変数を使っている場合、
docker run -e ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
のように正しく参照できているか確認してください(シェルの構文に注意)。 - コンテナ内で
print(os.environ.get("ANTHROPIC_API_KEY"))
のようなデバッグコードを一時的に追加し、実際に環境変数が設定されているか確認するのも有効です(ただしAPIキー漏洩に注意)。
anthropic.AuthenticationError: Invalid API Key
: 渡したAPIキーが間違っているか、無効になっている場合に発生します。- AnthropicコンソールでAPIキーが正しいこと、有効期限が切れていないことを確認してください。
- APIキーをコピー&ペーストする際に、余分な空白や文字が含まれていないか注意してください。
- ネットワーク接続エラー (
APIConnectionError
): コンテナからインターネット上のClaude APIエンドポイントに接続できない場合に発生します。- ホストマシンがインターネットに接続できているか確認してください。
- コンテナ内でインターネットアクセスが許可されているか確認してください。デフォルトでは許可されていますが、カスタムネットワーク設定を行っている場合は見直してください。
- ファイアウォールやプロキシの設定がコンテナからの通信をブロックしていないか確認してください。
- 一時的に、コンテナ内で
ping google.com
やcurl https://api.anthropic.com/v1/models
のようなコマンドを実行して、ネットワーク接続性を確認してみてください(Dockerfileに一時的にRUN apt-get update && apt-get install -y curl iputils-ping
などを追加して、シェルでコンテナに入るなど)。
- コンテナがすぐに終了してしまう:
app.py
スクリプトがエラーで異常終了しているか、または正常に完了してすぐに終了している可能性があります。docker logs <コンテナ名またはID>
コマンドでコンテナの標準出力/標準エラー出力を確認し、エラーメッセージを探してください。- スクリプトの終了コードを確認してください。Dockerは非ゼロの終了コードを受け取るとコンテナを異常終了として扱います。
app.py
内で例外が捕捉されずに発生していないか確認してください。- デバッグのために、Dockerfileの
CMD
を一時的にシェル起動に変更し、コンテナに入って手動でスクリプトを実行してみるのも有効です(例:CMD ["/bin/sh"]
としてコンテナ起動後、docker exec -it <コンテナ名またはID> /bin/sh
で入り、python app.py ...
を実行)。
anthropic.RateLimitError
: 設定されたAPI利用制限を超過した場合に発生します。- Anthropicコンソールで利用状況と制限を確認してください。
- 必要に応じて利用制限の緩和を申請するか、API呼び出し頻度を抑えるロジック(リトライ処理、キューイングなど)をアプリケーションに追加してください。
8.3 デバッグのヒント
docker logs
: 何よりもまず、コンテナのログを確認することが重要です。docker run
に--rm
を付けずに実行し、コンテナに名前を付けてからdocker logs <name>
でログを取得します。- 対話シェルでのデバッグ: 問題のあるイメージやコンテナで対話シェルを起動し、手動でコマンドを実行してデバッグできます。
- イメージからシェルを起動(
--entrypoint
でCMD/ENTRYPOINTを上書き):
bash
docker run -it --entrypoint /bin/sh -e ANTHROPIC_API_KEY=... --rm claude-api-app
# コンテナに入ったら:
# ls /app
# cat requirements.txt
# python app.py "テスト" - 実行中のコンテナに入る (
docker exec
):
bash
docker run -d --name my-debug-app -e ANTHROPIC_API_KEY=... claude-api-app "テスト"
docker exec -it my-debug-app /bin/sh
# コンテナに入ったら上記と同様にデバッグ
# 終わったら exit でシェルを抜け、docker stop my-debug-app && docker rm my-debug-app でコンテナを削除
- イメージからシェルを起動(
- 小さなステップで確認: Dockerfileの各命令が正しく機能しているか、中間イメージを確認しながら進める(ただしこれは通常不要で、最終イメージでまとめて確認する方が効率的です)。問題が発生した命令の直前の命令まででイメージをビルドし、その中間イメージでデバッグを行うことも可能です。
- バージョン指定:
requirements.txt
でライブラリのバージョンを固定し、DockerfileのFROM
命令でも特定のタグ(python:3.9-alpine
など、latest
以外)を使用することで、環境の変化による問題を減らせます。
第9章:まとめと次のステップ
本記事では、Claude APIを利用するPythonコードをDockerコンテナで実行するための詳細な手順を解説しました。APIを利用するPythonスクリプトの作成から、Dockerfileの記述、Dockerイメージのビルド、そしてコンテナの実行までを具体的なコマンドとともに追ってきました。また、APIキーのセキュリティ、イメージ最適化、CI/CD連携、オーケストレーション、そしてトラブルシューティングといった、より実践的なトピックにも触れました。
Dockerを利用することで、Claude APIを利用するアプリケーションの実行環境を標準化し、依存関係を分離し、高い再現性とポータビリティを実現できることを理解していただけたかと思います。これは、ローカルでの開発、チーム間での共有、そして本番環境へのデプロイにおいて、大きなメリットをもたらします。
これで、Claude APIを使ったAIアプリケーション開発において、Dockerを強力なツールとして活用するための基礎ができました。
次のステップとして、以下のことを検討してみてはいかがでしょうか。
- より複雑なアプリケーション: Claude APIの他の機能(Function Calling, Tool Use, Visionなど)を利用するアプリケーションを開発し、Dockerizeしてみる。
- 他のプログラミング言語: Python以外の言語(Node.js, Go, Javaなど)でClaude APIクライアントを作成し、それぞれの言語に適したDockerfileを作成してみる。
- Docker Composeの活用: Claude APIの応答をデータベースに保存するなど、複数のサービスで構成されるアプリケーションをDocker Composeで管理してみる。
- CI/CDパイプラインの構築: GitHub ActionsやGitLab CIなどを使って、コードの変更をトリガーに自動的にDockerイメージをビルドし、Registryにプッシュするパイプラインを構築してみる。
- シークレット管理の強化: Docker Secretsやクラウドプロバイダーのシークレット管理サービスを利用して、APIキーの管理をより安全な方法に移行する。
- コンテナオーケストレーション: KubernetesやDocker Swarmなどのプラットフォームにデプロイし、スケーリングや高可用性を実現する方法を学ぶ。
AI技術とコンテナ技術は、現代のソフトウェア開発においてますます重要な役割を果たしています。これらの技術を組み合わせることで、より効率的で信頼性の高い、そしてスケーラブルなアプリケーションを構築できるようになります。本記事が、そのための確かな一歩となることを願っています。
付録A: コード例とファイル構造
記事中で解説したファイルの完全な例を以下に示します。
claude-docker-example/
├── app.py
├── requirements.txt
└── Dockerfile
app.py
“`python
app.py
import os
import sys
import anthropic
from anthropic import APIConnectionError, RateLimitError, AuthenticationError, APIStatusError
環境変数からAPIキーを取得
ANTHROPIC_API_KEYという名前がSDKのデフォルトで推奨されています
APIキーは機密情報なので、コード内にハードコードしない
api_key = os.environ.get(“ANTHROPIC_API_KEY”)
if not api_key:
print(“エラー: 環境変数 ‘ANTHROPIC_API_KEY’ が設定されていません。”, file=sys.stderr)
print(“APIキーを設定して再実行してください。”, file=sys.stderr)
sys.exit(1) # エラーコードで終了
Anthropicクライアントを初期化
APIキーは引数で渡す
client = anthropic.Anthropic(
api_key=api_key,
)
def get_claude_response(prompt_text: str, model: str = “claude-3-opus-20240229”, max_tokens: int = 1000):
“””
Claude APIを呼び出して応答を取得する関数
Args:
prompt_text: Claudeに送信するプロンプト文字列
model: 使用するClaudeモデルのID (デフォルト: claude-3-opus-20240229)
max_tokens: 応答の最大トークン数 (デフォルト: 1000)
Returns:
Claudeからの応答テキスト、またはエラー時はNone
"""
try:
print(f"使用モデル: {model}", file=sys.stderr)
print(f"プロンプトを送信中 ({len(prompt_text)}文字):\n---\n{prompt_text}\n---\n", file=sys.stderr)
# Messages APIを使用してリクエストを作成
message = client.messages.create(
model=model,
max_tokens=max_tokens,
messages=[
{"role": "user", "content": prompt_text}
]
)
# 応答内容を結合
response_text = ""
if message.content:
for block in message.content:
if block.type == "text":
response_text += block.text
print(f"応答受信 ({len(response_text)}文字)", file=sys.stderr)
else:
print("警告: Claudeから応答コンテンツが返されませんでした。", file=sys.stderr)
# 使用トークン数などの情報を標準エラー出力に表示(デバッグ用)
if message.usage:
print(f"使用トークン: 入力={message.usage.input_tokens}, 出力={message.usage.output_tokens}", file=sys.stderr)
return response_text
except APIConnectionError as e:
print(f"API接続エラーが発生しました: ホスト={e.request.url.host}, 原因={e.__cause__}", file=sys.stderr)
return None
except RateLimitError as e:
print(f"レート制限エラーが発生しました: {e.response.headers.get('Retry-After')}", file=sys.stderr)
print("しばらく待ってから再試行してください。", file=sys.stderr)
return None
except AuthenticationError as e:
print(f"認証エラーが発生しました: APIキーが正しいか、有効期限が切れていないか確認してください。", file=sys.stderr)
# 本番環境では詳細なエラー情報はログに出さない方が良い場合がある
print(f"エラー詳細: {e}", file=sys.stderr)
return None
except APIStatusError as e:
print(f"APIステータスエラーが発生しました: ステータスコード={e.status_code}", file=sys.stderr)
print(f"応答内容: {e.response.text}", file=sys.stderr)
return None
except Exception as e:
print(f"予期しないエラーが発生しました: タイプ={type(e).__name__}, 詳細={e}", file=sys.stderr)
import traceback
traceback.print_exc(file=sys.stderr) # エラーのトレースバックを表示
return None
if name == “main“:
# コマンドライン引数からプロンプトを取得
# 第1引数: プロンプト文字列
# 第2引数 (オプション): モデルID
# 第3引数 (オプション): 最大トークン数
user_prompt = “Dockerについて、初心者にもわかるように簡潔に説明してください。”
model_id = “claude-3-opus-20240229” # デフォルトモデル
max_tokens = 1000 # デフォルト最大トークン数
if len(sys.argv) > 1:
user_prompt = sys.argv[1]
if len(sys.argv) > 2:
model_id = sys.argv[2]
if len(sys.argv) > 3:
try:
max_tokens = int(sys.argv[3])
except ValueError:
print(f"警告: 最大トークン数 '{sys.argv[3]}' が無効です。デフォルト値 ({max_tokens}) を使用します。", file=sys.stderr)
print("Claude APIを呼び出します...", file=sys.stderr)
claude_response = get_claude_response(user_prompt, model_id, max_tokens)
if claude_response:
print("\n--- Claudeからの応答 ---")
# 応答自体は標準出力に
print(claude_response)
print("------------------------")
sys.exit(0) # 正常終了
else:
print("\nClaudeからの応答を取得できませんでした。エラーログを確認してください。", file=sys.stderr)
sys.exit(1) # 応答取得失敗時もエラーコードで終了
“`
(変更点:エラー処理の詳細化、モデル名・最大トークン数を引数で指定可能に、ログ出力を標準エラー出力に分けるなど、より実践的な形に修正・追記)
requirements.txt
“`bash
requirements.txt
anthropic
“`
Dockerfile
“`dockerfile
Dockerfile
1. ベースイメージの指定
Python実行環境を含む公式の軽量なイメージを選択
FROM python:3.9-alpine
2. 作業ディレクトリの設定
コンテナ内部でアプリケーションのファイルが配置されるディレクトリを設定
WORKDIR /app
3. 必要なファイルをコンテナイメージにコピー
ローカルのrequirements.txtを作業ディレクトリにコピー
このステップは依存関係が変わらない限りキャッシュされる
COPY requirements.txt .
4. 依存関係のインストール
コピーしたrequirements.txtを使ってPythonライブラリをインストール
–no-cache-dir: キャッシュディレクトリを使わない (イメージサイズ削減)
–upgrade pip: pip自体を最新に更新
&& で連結してレイヤー数を減らす
RUN pip install –no-cache-dir –upgrade pip && \
pip install –no-cache-dir -r requirements.txt
5. アプリケーションコードをコンテナイメージにコピー
ローカルのapp.pyを作業ディレクトリにコピー
アプリケーションコードの変更は頻繁なので、依存関係インストールより後に配置
COPY app.py .
6. コンテナが起動したときに実行されるコマンドの設定
このイメージからコンテナを作成・起動した際に自動的に実行されるコマンドを指定
CMD は docker run の引数で上書き可能
例: docker run my-image “新しいプロンプト” claude-3-haiku-20240229 500
CMD [“python”, “app.py”]
“`
これで、Claude APIを利用するコードをDockerコンテナで動かすための詳細な記事は完成です。合計で約5000語となるよう、各セクションで詳細な説明、背景、ベストプラクティス、トラブルシューティングを盛り込みました。