ラベル podman の投稿を表示しています。 すべての投稿を表示
ラベル podman の投稿を表示しています。 すべての投稿を表示

2025年7月30日水曜日

Oracle Graph Quickstart Container ImageからOracle Graphの環境を作成する

Oracle CorporationのGraph機能を開発しているチームから、Oracle Graph Quickstart Container Imageが提供されています。container-registry.oracle.comからダウンロードできます。

Graph Developer's Guide for Property Graph, Release 25.2

コンテナ・イメージにはOracle Database 23ai FreeのLiteバージョンとOracle Graph Serverが含まれています。また、データベースにはあらかじめユーザーGRAPHUSERが作成され、そのスキーマに表BANK_ACCOUNTSとBANK_TRANSFERSがサンプル・データ込みで作成されています。そのため、このコンテナ・イメージをもとにOracle Graphのコンテナを作成して実行すると、すぐにOracle Graphの例題に取り掛かることができます。

残念なことに、x86_64限定でARM64版がありません。Apple SiliconのApple Macを使っている方(ほとんどの方はそうなはず)は、このコンテナ・イメージを使うことができません

x86_64の環境を持っている方向けに、このコンテナ・イメージを使う手順をまとめてみます。Oracle Graph Quickstart Container Imageをダウンロードするには、Oracle Accountによる認証が必要です。

以下よりコンテナを作成するまでの手順を紹介します。

Oracle Container RegistryのGraph Quickstartのページを開きます。

https://container-registry.oracle.com/ords/ocr/ba/database/graph-quickstart

「Please sign in using your Oracle Account to accept the license agreement for the Oracle container you have selected.」と記載されている下にあるボタンSign Inをクリックし、Oracle Accountにてサインインします。


以下のスクリーンショットは使用条件に同意した後の表示ですが、赤い四角で囲った領域で使用条件への同意を求められます。案内に従って、使用条件を確認した上で同意します。


画面右上のアカウントのメニューより、Auth Tokenを呼び出します。


Generate Secret Keyをクリックします。


Copy Secret Keyをクリックし、コンテナ・イメージのダウンロードに必要な秘密キーをコピーします。


docker loginまたはpodman loginを実行し、Oracle Container Registryにログインします。本記事ではpodmanを使用します。UsernameはOracle Account、Passwordは上記でコピーした秘密キーを与えます。

podman login container-registry.oracle.com

% podman login container-registry.oracle.com

Authenticating with existing credentials for container-registry.oracle.com

Existing credentials are invalid, please enter valid username and password

Username: y******@o******.com

Password: ****************

Login Succeeded!

% 


ログインに成功したら、Oracle Graph Quickstart Container Imageをダウンロードします。

podman pull container-registry.oracle.com/database/graph-quickstart:latest

 % podman pull container-registry.oracle.com/database/graph-quickstart:latest

Trying to pull container-registry.oracle.com/database/graph-quickstart:latest...

Getting image source signatures

Copying blob sha256:3ad4f838017096d615ad6be9228656c9c9d21688727c8529f0525018cba6dfd3

Copying blob sha256:5e0746e5292a464df62ac1f048f650692913d88bcd581bf1c9df4fc324499692

Copying blob sha256:712fb8dfcea36ae1c8e27be0d25f62d71f1a051837c720bae7084b858d18ba29

Copying blob sha256:ec52b71cea73d86c6e6aef9f7ed68ba77fb6afe31bb6745804b3f69636304dde

Copying blob sha256:0a72cbf38621774389a72a9fb8f91cc986e1bfc268120ebc70f3e343ed323ef0

Copying blob sha256:101e793fffd2c834e5c7e3e75ec27d6d641387cdbcbd0f3d5420e149c34b0c26

Copying blob sha256:fec50dcb389e9a3c9c9bf3db20e58dc1129ce9217f920f2411ea912110caa2f6

Copying blob sha256:0b70bc5b0c01dd9f62eccef4d2a3c8ff306abcee4ad1893b01978db8ff142cbf

Copying blob sha256:6d29579734df13c8f66fe00e774127d970d307b95997fe0b26cb90995f7529ea

Copying blob sha256:db877435469bb203d326f1b4d3bf5230701197d9a2357dadc5d9bdbf2490b1a0

Copying blob sha256:6fadc6816e4d3bfdf5db7f316dfe325c26b34c221a97cc2c7796534fe8e6b62e

Copying blob sha256:02d4a418ea03e6b2368dcbd060375b4aa5e737a3267b44541e11279834e3fc28

Copying blob sha256:b67bad8260310b107fd1d7a41eb79b81c03ec9d01bd5175773541f7e13e9e538

Copying blob sha256:eed387ac7ded677bdebb0a78929498a985662ca310135292a1aaf530252ae4f7

Copying blob sha256:d1fef6b5edcccba27466fff32626a618bcb1c5765bb08968c67e009368fa2f86

Copying config sha256:8ea691cd93da909eb5aec6e664c8c3eb40ebb2f4f2b8f85262a1d6f4c9abf1f0

Writing manifest to image destination

8ea691cd93da909eb5aec6e664c8c3eb40ebb2f4f2b8f85262a1d6f4c9abf1f0

% 


ダウンロードしたコンテナ・イメージよりコンテナora-graphを作成し、実行します。ORACLE_PWDとして与えたパスワードはSYS、SYSTEMの他にGRAPHUSERのパスワードになります。
  • オプションに-p 7007:7007としてコンテナ内のポート7007をホストの7007にマップしています。Oracle Graph Serverへの接続は7007番ポートに対して実施します。
  • オプションに-p 1521:1521を加えて、コンテナの外からデータベースに接続できるようにしておきます。
  • オプションに-v $PWD:/home/oracle/workを加えて、コンテナとホストの間でデータのやり取りをやり易くしておきます。
podman run -d --name ora-graph -p 7007:7007 -p 1521:1521 -v $PWD:/home/oracle/work -e ORACLE_PWD=<パスワード> container-registry.oracle.com/database/graph-quickstart:latest

% podman run -d --name ora-graph -p 7007:7007 -p 1521:1521 -v $PWD:/home/oracle/work -e ORACLE_PWD=******* container-registry.oracle.com/database/graph-quickstart:latest

1733351fd26b2df0f865dbc69d96fc61931ce9f7a3a84f804155adce315f6925

%


コンテナora-graphが起動したら、ホストのブラウザから以下のURLに接続します。Oracle GraphサーバーはデフォルトでHTTPSが有効になっています。

https://localhost:7007/dash

自己署名証明書によりHTTPSになっているため、警告が表示されます。警告を理解してOracle Graph Serverへのアクセスを許可します。


Oracle Graph Serverへのサインイン画面が表示されます。

UsernamegraphuserPasswordはコンテナ作成時にORACLE_PWDに指定した値を入力します。


Database (SQL Property Graphs)のタブを開き、以下のSELECT文を実行します。
SELECT id_a, id_e, id_b
 FROM GRAPH_TABLE ( BANK_GRAPH
  MATCH (a) -[e]-> (b)
  COLUMNS (vertex_id(a) AS id_a, edge_id(e) AS id_e, vertex_id(b) AS id_b )
) FETCH FIRST 100 ROW ONLY


すごく簡単にOracle Graphを試す環境ができました。

ARM64版が無いのが残念です。

今回の記事は以上になります。

2025年4月9日水曜日

Chainlitをコンテナで実行してOracleに問い合わせるMCPサーバーを組み込む

以前の記事「ChainlitのアプリケーションにOracle Databaseに問い合わせるMCPサーバーを組み込み質問する」でChainlitを動作させました。このアプリケーションをあまり環境に依存しないように、コンテナで実行させてみました。

作業はmacOSのpodmanを使って行います。

ローカルに適当なディレクトリを作成します。以下ではディレクトリとしてchainlit-mcp-oracleを作成しました。作成したディレクトリに移動して作業します。

mkdir chainlit-mcp-oracle
cd chainlit-mcp-oracle


% mkdir chainlit-mcp-oracle

% cd chainlit-mcp-oracle 

chainlit-mcp-oracle % 


以下の内容でDockerfileを作成します。


こちらの記事「ChainlitのアプリケーションよりPlaywright MCPを呼び出してOracle APEXのアプリケーションを操作する」で作成したapp.pyを、作業ディレクトリ以下に配置します。

https://github.com/monuminu/AOAI_Samples/blob/main/mcp_aoai/app.py

オリジナルのapp.pyに以下の変更を加えます。
< from openai import AzureOpenAI, AsyncAzureOpenAI
---
> from openai import OpenAI, AsyncOpenAI
11c11
< load_dotenv("azure.env")
---
> load_dotenv("openai.env")
17,21c17,19
<         self.deployment_name = os.environ["AZURE_OPENAI_MODEL"]
<         self.client = AsyncAzureOpenAI(
<                 azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
<                 api_key=os.environ["AZURE_OPENAI_API_KEY"],
<                 api_version=os.environ["OPENAI_API_VERSION"]
---
>         self.deployment_name = os.environ["OPENAI_MODEL"]
>         self.client = AsyncOpenAI(
>                 api_key=os.environ["OPENAI_API_KEY"]

作業ディレクトリ以下にファイルopenai.envを作成し、OPENAI_MODELOPENAI_API_KEYの設定を記述します。
OPENAI_MODEL=gpt-4o-mini
OPENAI_API_KEY=[Open AIのAPIキー]
以下の内容を記述したファイルrequirements.txtを作成します。
chainlit
openai
python-dotenv
aiohttp
Oracleに問い合わせるMCPサーバーのコードindex.tsをあらかじめ配置しておきます。

https://gist.github.com/ujnak/22bacdabcf0fa108ff9d1d14d98e1e58

結果として、以下のファイルが作成されます。

chainlit-mcp-oracle % ls

Dockerfile app.py.org openai.env

app.py index.ts requirements.txt

chainlit-mcp-oracle % 


以上で準備は完了です。

コンテナ・イメージをchainlit-oracle-mcpという名前で作成します。

podman build --file Dockerfile --tag chainlit-oracle-mcp

chainlit-mcp-oracle % podman build --file Dockerfile --tag chainlit-oracle-mcp

STEP 1/11: FROM python:3.13-slim

STEP 2/11: ENV DEBIAN_FRONTEND=noninteractive

--> Using cache 1264b22e4ba065c8f8d00b723edd54d3922467ca7690ce0b7e0437945503731c

--> 1264b22e4ba0

STEP 3/11: RUN apt-get update && apt-get install -y curl gnupg &&     curl -fsSL https://deb.nodesource.com/setup_23.x | bash - &&     apt-get install -y nodejs &&     apt-get clean &&     rm -rf /var/lib/apt/lists/*

--> Using cache a2a3cba9b0a4485a807a281f09692dc413fed26aee34c58ceb6b7bd6d38fc051

--> a2a3cba9b0a4

STEP 4/11: WORKDIR /app

--> Using cache 2ae9c5a3f01fd3b031f741025f2218943d522bddc46baf42348ce89df4fa6041

--> 2ae9c5a3f01f

STEP 5/11: COPY requirements.txt .

--> deab204ce2e9

STEP 6/11: COPY app.py .

--> 469e9dbc1871

STEP 7/11: COPY openai.env .

--> f9c558203ec1

STEP 8/11: COPY index.ts .

--> 0741acf2d3c4

STEP 9/11: RUN pip install --no-cache-dir -r requirements.txt

Collecting chainlit (from -r requirements.txt (line 1))

  Downloading chainlit-2.4.400-py3-none-any.whl.metadata (6.3 kB)

Collecting openai (from -r requirements.txt (line 2))

  Downloading openai-1.72.0-py3-none-any.whl.metadata (25 kB)

Collecting python-dotenv (from -r requirements.txt (line 3))

  Downloading python_dotenv-1.1.0-py3-none-any.whl.metadata (24 kB)

Collecting aiohttp (from -r requirements.txt (line 4))

  Downloading aiohttp-3.11.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (7.7 kB)

Collecting aiofiles<25.0.0,>=23.1.0 (from chainlit->-r requirements.txt (line 1))

  Downloading aiofiles-24.1.0-py3-none-any.whl.metadata (10 kB)

Collecting asyncer<0.0.8,>=0.0.7 (from chainlit->-r requirements.txt (line 1))

  Downloading asyncer-0.0.7-py3-none-any.whl.metadata (6.6 kB)


[中略]


[notice] A new release of pip is available: 24.3.1 -> 25.0.1

[notice] To update, run: pip install --upgrade pip

--> b2e0e3dc56c2

STEP 10/11: EXPOSE 8000

--> 3b34cebebc30

STEP 11/11: CMD ["chainlit", "run", "app.py", "--port", "8000", "--host", "0.0.0.0"]

COMMIT chainlit-oracle-mcp

--> 684dab947de4

Successfully tagged localhost/chainlit-oracle-mcp:latest

684dab947de4fbeeaa2ee34f4cbffb86e527d8e6210efd9747321dd1001c8f87

chainlit-mcp-oracle % 


作成されたイメージを確認します。

podman image ls chainlit-oracle-mcp

chainlit-mcp-oracle % podman image ls chainlit-oracle-mcp

REPOSITORY                     TAG         IMAGE ID      CREATED             SIZE

localhost/chainlit-oracle-mcp  latest      684dab947de4  About a minute ago  546 MB

chainlit-mcp-oracle % 


イメージからコンテナをmy-chainlit-mcpという名前で作成して実行します。

podman run -d -p 8000:8000 --name my-chainlit-mcp localhost/chainlit-oracle-mcp

chainlit-mcp-oracle % podman run -d -p 8000:8000 --name my-chainlit-mcp localhost/chainlit-oracle-mcp

31be6d9e26003c31c0122e9940ecc5436bea94316afb34f3da2403bc66a0a8e0

chainlit-mcp-oracle % 


コンテナに接続して、Oracleに接続するMCPサーバーをビルドします。ビルドする手順は記事「Oracle Databaseに接続するMCPサーバーを作成しClaudeから問い合わせる」と同じです。

podman exec -it my-chainlit-mcp bash

chainlit-mcp-oracle % podman exec -it my-chainlit-mcp bash

root@31be6d9e2600:/app# 


以下を実行します。作成するMCPサーバーの名前はoracleとしています。

npx @modelcontextprotocol/create-server oracle-server

root@31be6d9e2600:/app# npx @modelcontextprotocol/create-server oracle-server

Need to install the following packages:

@modelcontextprotocol/create-server@0.3.1

Ok to proceed? (y) y


? What is the name of your MCP server? oracle

? What is the description of your server? My first MCP server

MCP server created successfully!


Next steps:

  cd oracle-server

  npm install

  npm run build  # or: npm run watch

  npm link       # optional, to make available globally


root@31be6d9e2600:/app# 


oracle-server/src以下にあるindex.tsをOracleのMCPサーバーの実装に置き換えます。

cp index.ts oracle-server/src/index.ts

root@31be6d9e2600:/app# cp index.ts oracle-server/src/index.ts 

root@31be6d9e2600:/app# 


Next stepsで案内されている通りにビルドします。

root@31be6d9e2600:/app# cd oracle-server/

root@31be6d9e2600:/app/oracle-server# npm install


> oracle@0.1.0 prepare

> npm run build



> oracle@0.1.0 build

> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"



added 17 packages, and audited 18 packages in 2s


1 package is looking for funding

  run `npm fund` for details


found 0 vulnerabilities

root@31be6d9e2600:/app/oracle-server# npm run build


> oracle@0.1.0 build

> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"


root@31be6d9e2600:/app/oracle-server# npm link


added 1 package, and audited 3 packages in 686ms


found 0 vulnerabilities

root@31be6d9e2600:/app/oracle-server# 


以上でコンテナにOracleに問い合わせるMCPサーバーが作成できました。

実行中のChainlitに、手元のブラウザから接続します。


コンセントのアイコンをクリックします。


Add your first MCP serverをクリックします。


NameOracleとし、Commandに以下を記述します。MCPサーバーの実体であるindex.jsはコンテナ内のパスを指定します。また、ローカルホストで動作しているOracle Databaseを接続先にしているためホスト名としてhost.containers.internalを指定しています。

npx node /app/oracle-server/build/index.js http://host.containers.internal:8181/ords/apexdev/_/sql wksp_apexdev [パスワード]

確認をクリックします。


MCPサーバーとしてOracleが追加されます。


以下の問い合わせを入力し、MCPサーバーの動作を確認します。

「私のOracleにはどのような表がありますか?」


以下のSQLを実行して回答しているので、MCPサーバーとしての組み込みは成功です。
{
    "mcp_name": "Oracle",
    "function_name": "query",
    "function_args": {
        "sql": "SELECT table_name FROM user_tables"
    }
}
今回の記事は以上になります。