20210914のdockerに関する記事は5件です。

docker + mysql 日本語対応する

はじめに dockerのコンテナの中でmysqlを使用してテーブル表示させたら、日本語で登録しているところが????になっていました。 日本語でちゃんと表示できるように設定します。 解決策 ローカルのアプリのsrc/db/にmy.cnfというファイルを作成して下記の記述をします。 コンテナの中のmysqlの設定ファイルの内容をこのファイルに書いてそれをコンテナのファイルにコピーします。 src/db/my.cnf [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci default-authentication-plugin = mysql_native_password [mysql] default-character-set = utf8mb4 [mysqld] character-set-server=utf8mb4 [client] default-character-set = utf8mb4 docker-compose.ymlのvolumes:に下記を追加します。 docker-compose.yml #~省略~ - ./src/db/my.cnf:/etc/mysql/my.cnf #~省略~ あとはコンテナを立て直してデータベースを見ると日本語で表記されていました。 うまくいかなかったこと この解決策をいろいろ調べていたらdocker-compose.ymlのcommand: に下記の記述を追加すればいいという回答がたくさん出てきました。 docker-compose.yml #~省略~ command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci しかし、うまくいきませんでした。 もし上記のcommandが実行されていた場合にmysqlの設定に記述されるものが先ほど紹介したmy.cnfの中身です。 コマンドで設定するやり方を諦めて、自分で作ってコンテナにコピーといった感じでしょうか。 最後に 日本語表示はうまくいったのですが、コンソールから日本語を入力してもenterを押すと消えてしまいます。 次はそれを解決しなければ。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Hacobune】Discord Bot起動してみた

概要 さくらインターネットのHacobuneというサービスでDiscordのBotを運用しています。この起動手順についてまとめます。 Hacobuneは今はβ版のお試し期間なので無料で使えます。すごく簡単なのでお試しください。 Node.jsとTypeScript、Dockerで作成した私のGithubレポジトリで環境を構築していきます。 できるようになること DiscordのBotをHacobuneで起動できる node, typescriptのDiscordBot開発のベースを作ることができる 必要なもの Hacobuneのアカウント 以下のマニュアルを参考にアカウントを作成してください https://manual.c1.hacobuneapp.com/docs Dockerで動作するDiscord BotのGithub Repository 今回はサンプルとして私のレポジトリを使用します。Node.jsとTypeScriptで開発しましたので参考にしてください。 https://github.com/nodokamome/discord-bot-template Discord Botアカウント、およびそのトークン 作成の方法と自分のサーバーへの追加方法は以下を参考にしてください。 Discord.jsの公式ドキュメント https://discordjs.guide/preparations/setting-up-a-bot-application.html#creating-your-bot 私の個人ブログ記事 https://blog.nodokamome.com/discord/discord-add-bot/ サンプルプロジェクト・ソース 今回は私のDiscord Botテンプレートで説明します。 テストされる際はこちらをforkやcloneしてお試しください。 Discord Bot開発の記事ではないので深くは説明しないですが、discord.jsというnpmライブラリで開発をしています。 ├ src/ | └ index.ts // DiscordBotの動作を記載するファイル。 | ├ .dockerignore // 軽量なDockerImageを作成するときに使うファイル。node_moduleと.gitが書いてあれば良いと思います。 ├ .Dockerfile // DiscordBotのDockerImageを作成するために使うファイル。Hacobuneを使うにはこれが必須です。 ├ .package.json // nodeを使うためのファイル └ .tsconfig.json // TypeScriptを書くためのファイル // .gitignore, README.md, package-lock.json は説明不要と思い省略しています ソース説明 index.tsとDockerfileだけ記載します。他のファイルは私のレポジトリリンクから参照できます。 特に説明することもないですね。 この書き方であればTSでなくても良いと思いますがTemplateなのでとりあえずTSにしてます。 Botの動作は!pingがチャンネルで入力されたときにpongを返すようにしました。 index.ts import { Client } from 'discord.js'; import { config } from 'dotenv'; config(); (function main() { const client = new Client(); client.on('message', async (message) => { if (message.author.bot) return; if (message.content === '!ping') { message.channel.send('pong'); } }); client.once('ready', () => { console.log('Connected to Discord successfully!'); }); client.login(process.env.DISCORD_TOKEN); })(); カッコつけてbuildとruntime用を分けてImageを作成してます。特に意味はないですが軽量化されている気がします。 Botのための特別なことはしておらず、ビルドして実行しているだけなのでご自由に変更してください。 Dockerfile # ---------- # build(tscを実行してjsを作る)用のstage # ---------- FROM node:14 AS build WORKDIR /build COPY . . RUN npm install RUN npm run build # ---------- # runtime用のstage # 必要なファイルは dist/, node_modules/, package.json, package-lock.json のみ # ---------- FROM node:14 WORKDIR /usr/src/app COPY package*.json ./ # ランタイムに必要な依存パッケージのみインストールし、同時にnpmのcacheファイルを削除する RUN npm install --production --cache /tmp/empty-cache && rm -rf /tmp/empty-cache ENV TZ=Asia/Tokyo # --fromで前半で記述したAS buildと命名した中間イメージから必要なファイルのみ抽出する事ができる(distディレクトリにtsコンパイル結果であるjsファイルが出力されている) COPY --from=build /build/dist ./dist CMD [ "npm", "start" ] Github連携でHacobuneにDiscord Bot導入 プロジェクトからDiscord Bot用プロジェクトを新規作成する。 今回はテストなのでDiscord Botという名前と適当な説明を入力し、作成ボタンをクリックします。 アプリケーションからDiscord Botのアプリケーションを新規作成する。 今回はGithub連携でソースを取得するので、必要な情報を入力し、GithubをクリックしてDiscord Bot用のRepositoryを選択します。 Botの起動に.envファイルが必要なので設定ファイルから追加します。 設定ファイルのモーダルに事前に用意したDiscord BotのTokenを入力し、作成ボタンをクリック。 入力する内容は以下の形式で入力します。もしご自身のプロジェクトで他にも環境変数があるのであればこちらから追加してください。 DISCORD_TOKEN=コピーしたDiscordのBot Token 作成ボタンをクリックすると、入力したファイルが追加されていることがわかります。もしTokenを変更したい場合は、編集から変更できます。 その他は変更せずに作成ボタンをクリック。 今回はリソースプランをフリーで作成していますが、もしBotからのレスポンスが遅いと感じた場合は上位のプランに変更することをおすすめします。 追加したbotのアプリケーションからログをクリックし、ビルドとアプリケーションのログを確認します。。 Dockerのビルドをリアルタイムで確認できますので、何かエラーがあればここから確認してください。 Successfullyとビルドが成功したら、アプリケーションログをクリックしてブラウザをリロードしてください。 Connected to Discord successfully!と表示されて、ビルド完了しステータスが稼働中になっているはずです。 Botを招待したDiscordチャンネルのオンラインステータスを確認し、追加したBotアカウントがオンラインになっていれば成功です。 起動確認 オンラインが確認できるチャンネルで!pingとメッセージを入力するとボットからpongと返信があることがわかります。 これでHacobuneでのDiscord Botの起動が成功しました。 まとめ Dockerで動くBot環境があれば簡単にHacobuneで環境を用意できます。 今なら無料で試すことができるのでDiscord Bot開発をしている人はぜひ試してください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TypeScriptでDocker上に構築したPostgreSQLに接続

はじめに DB からのデータ取得などの動作を含む簡単な Web アプリを試したい。PoC レベルでバックエンド側の API 作成まで行うのは時間がかかりすぎるため、本記事では TypeScript から PostgreSQL に接続し、データ取得を行う。また PostgreSQL 環境自体も容易に作成・破棄できるよう Docker コンテナ上に構築している。詳細は Dockerコンテナ上のPostgreSQLにデータベースを作成を参照。実行環境は以下。 Windows 10 Pro (WSL2: Ubuntu-20.04) pg 6.14.15 @types/pg 6.14.15 公式ドキュメントを参考にした。 ライブラリのインストール まず PostgreSQL に接続するためのライブラリ pg をインストールする。今回は TypeScript で扱いたいので、合わせて型定義 @types/pg もインストールしておく。 $ npm install pg $ npm install @types/pg DB 接続プログラム 続いて、pg を用いて DB に接続する。公式ドキュメントを参考に作成したプログラムは以下。Client 内の設定は Dockerコンテナ上のPostgreSQLにデータベースを作成と同様のものとしている。 dbOpe.ts const { Client } = require('pg'); const client = new Client({ user: 'postgres', password: 'postgres', host: '[host address]', // 詳細は後述 database: 'test_db', port: 5432 }); client.connect(); console.log('connected') client .query('select now()') .then((res: any) => console.log(res.rows)) .catch((err: any) => console.error('connection error', err.stack)) .then(() => client.end()) .then(() => console.log('disconnected')); ここで host は Docker コンテナにアクセスすることで確認できる。 $ docker exec -it [container id] /bin/bash root:/# hostname -i たとえばこの際に 172.17.0.2 が得られたとする。しかし、このアドレスをそのまま指定しても接続することはできなかった。詳細は理解できていないが、172.17.0.1 のように同じネットワークアドレスかつホストアドレスが 1 のアドレスを指定するとアクセスできた。デフォルトゲートウェイ(?)が原因のようだが、わかっていないので詳しい方がいたらぜひ教えて下さい。 上記 ts ファイルをトランスパイルして、実行すると以下のような出力が得られる。 $ tsc dbOpe.ts && node dbOpe.js connected [ { now: 2021-09-10T05:03:25.955Z } ] disconnected DB にアクセスし、データ取得できたことが確認できる。 おわりに pg ライブラリを使用して、DB に接続した。API なしでフロントエンドから直接 DB を参照できるかと考えたが、こちらによると pg は Node.js でしか実行できないようだ。PoC レベルでもフロントエンドと DB を接続するには Web API を作成するしかないか。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerでofficialのイメージとdocker-compose使ってWordPressの環境作った時にハマったこと

Apple silicon (M1)macのDocker DesktopとDockerのオフィシャルのWordPressイメージ使ってローカルの開発環境構築しようとしたらめっちゃハマったのでメモ docker-compose.yml 参考までに今回使ったdocker-compose.yml version: "3" networks: backend: driver: bridge volumes: db_data: driver: local services: db: image: arm64v8/mariadb volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress ports: - 13306:3306 networks: - backend wp: depends_on: - db image: wordpress:latest volumes: - ./:/var/www/html networks: - backend ports: - 8000:80 - 4430:443 restart: always environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: - ./:/var/www/html ここで./(docker-compose.ymlがあるディレクトリ)をDocumentRootにしてる。 あとからmysqlのユーザ名とか変えると再ビルドが必要 再ビルドしなくてもDB側で変更したユーザを追加すれば良いんだけど、面倒だった。 面倒なのでステージングと同じユーザ名使おうとしたのがいけなかった。ローカルとは環境変数分けよう。 ドキュメントルートにphp.iniとかあると読み込まれる。 php.iniは必要に応じて消しておく。 https(SSL)でアクセスできない デフォルトだとそもそもSSLが有効になっていない /etc/apache2/conf-enable /etc/apache2/site-enable あたりを見るとわかる。 自己証明書を作る こちらを参考に証明書を/etc/ssl/privateに作る ssl-cert packageは使えなくなってた SSL moduleを有効化する # cd /etc/apache2/mods-enabled # a2enmod ssl apache 再起動 # service apache2 restart default-sslを有効化する # cd /etc/apache2/sites-enabled # a2ensite Your choices are: 000-default default-ssl Which site(s) do you want to enable (wildcards ok)? * Site 000-default already enabled Enabling site default-ssl. To activate the new configuration, you need to run: service apache2 reload 作成したオレオレ証明書に合わせてdefault-sslを編集する # A self-signed (snakeoil) certificate can be created by installing # the ssl-cert package. See # /usr/share/doc/apache2/README.Debian.gz for more info. # If both key and certificate are stored in the same file, only the # SSLCertificateFile directive is needed. SSLCertificateFile /etc/ssl/private/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key apache リロード # service apache2 reload chromeでアクセス 不正な通信とかいわれるので、thisisunsafeとタイプして読み込む。  まとめ 面倒なんで誰か1個のコンテナでMySQLもSSLも動くWordPressのイメージ作ってくれ。 その他 KUSANAGIのdocker使おうとしたら、コンテナいっぱい立ち上がるし、動かすディレクトリのパスにスペース入ってると動かなかった。 これ速いし、Drupalやconcrete5が動く環境も簡単に作れるから便利だから今回は残念だった。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Orthanc を使ってみた-その2

Orthanc を使ってみた-その2 その1からの続きです。 今回やってみたいことはこちら。 テスト用に orthanc のコンテナを同時に2つ立ち上げる Docker compose を使う REST API を使う Lua 言語を使う 受信したデータのtagを調べる 受信したデータをファイルとして出力する 受信したデータを別の orthanc へ転送する orthanc のコンテナを同時に2つ立ち上げる 作るコンテナの設定内容はこちら。 Orthanc 1 Container name: orthanc1 IP: 192.168.10.11 container name: orthanc1 HTTP port number: 50010 AET: ORTHANC1 Dicom port number: 60010 PostgreSQL 1 Container name: orthanc-postgres1 IP: 192.168.10.12 Port: 5432 Database: orthanc Username: otpostgres Password: otpassword Orthanc 2 Container name: orthanc2 IP: 192.168.10.13 container name: orthanc2 HTTP port number: 50020 AET: ORTHANC2 Dicom port number: 60020 PostgreSQL 2 Container name: orthanc-postgres2 IP: 192.168.10.14 Port: 5432 Database: orthanc Username: otpostgres Password: otpassword DB の初期化 Orthanc2 用の設定ファイルと Database のディレクトリを作成し、Orthanc2 用の database を生成しておきます。その1と同じ手順です。 $ mkdir ~/Orthanc/Config2/ $ mkdir ~/Orthanc/DB2/ $ docker run -d --name orthanc-postgres2 \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /home/hogehoge/Orthanc/DB2/:/var/lib/postgresql/data \ -e POSTGRES_USER=otpostgres \ -e POSTGRES_PASSWORD=otpassword \ --net=orthanc_nw --ip=192.168.10.14 \ postgres:13.3 $ docker run -it --link orthanc-postgres2:postgres \ --net=orthanc_nw --rm postgres:13.3 \ sh -c 'echo "CREATE DATABASE orthanc;" \ |exec psql -h 192.168.10.14 -p 5432 -U otpostgres -h 192.168.10.14' パスワードの入力を求められるので、 "otpassword" と入力します。これで database が出来ました。 "orthanc-postgres2" を停止、削除します。 $ docker stop orthanc-postgres2 $ docker rm orthanc-postgres2 設定ファイルの編集 オリジナルの設定ファイルをエクスポートして、編集します。これもその1と同じ手順です。 $ docker run --rm --entrypoint=cat \ jodogne/orthanc-plugins:1.9.6 \ /etc/orthanc/orthanc.json > ~/Orthanc/Config2/orthanc.json ~/Orthanc/Config2/orthanc.json // HTTP port 番号の変更 (line 81) "HttpPort" : 50010, // AET の変更 (line 119) "DicomAet" : "ORTHANC2", // DICOM port 番号の変更 (line 126) "DicomPort" : 60010, // すべての SOP class を受け入れる (line 160) "UnknownSopClassAccepted" : true, // ID, Password を入力させるための "//" の削除 (line 229) "RegisteredUsers" : { "alice" : "alicePassword" }, // 末尾に "," の追加 (line 826) "SynchronousZipStream" : true, // PostgreSQL を使うための設定 (line 827) "PostgreSQL":{ "EnableIndex":true, "EnableStorage":true, "Host":"192.168.10.14", "Port":5432, "Database":"orthanc", "Username":"otpostgres", "Password":"otpassword" } Orthanc1 と orthanc2 で通信をしますので、~/Orthanc/Config1/orthanc.json を編集します。 ~/Orthanc/Config1/orthanc.json // 下記の行を追加 (line 322) "ORTHANC1" : ["ORTHANC1", "192.168.10.11", 60010], "ORTHANC2" : ["ORTHANC2", "192.168.10.13", 60010] 編集後は構文チェックします。 $ cat ~/Orthanc/Config1/orthanc.json |json_verify -c JSON is valid $ cat ~/Orthanc/Config2/orthanc.json |json_verify -c JSON is valid これで下準備は完了です。 Docker compose  その1ではコマンドラインでコンテナを起動していましたが、毎度合計4つのコンテナを起動するためにいちいちコマンドを打ち込む(又はコピペする)のも大変なので、docker compose を使用します。~/Orthanc/docker-compose.ymlを作成します。 ~/Orthanc/docker-compose.yml version: "3" networks: orthanc_nw: driver: bridge ipam: driver: default config: - subnet: 192.168.10.0/24 services: orthanc1: image: jodogne/orthanc-plugins:1.9.6 container_name: orthanc1 ports: - 50010:50010 - 60010:60010 volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /home/hogehoge/Orthanc/Config1/:/etc/orthanc/ networks: orthanc_nw: ipv4_address: 192.168.10.11 restart: always orthanc2: image: jodogne/orthanc-plugins:1.9.6 container_name: orthanc2 ports: - 50020:50010 - 60020:60010 volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /home/hogehoge/Orthanc/Config2/:/etc/orthanc/ networks: orthanc_nw: ipv4_address: 192.168.10.13 restart: always postgres1: image: postgres:13.3 container_name: orthanc-postgres1 volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /home/hogehoge/Orthanc/DB1/:/var/lib/postgresql/data networks: orthanc_nw: ipv4_address: 192.168.10.12 restart: always postgres2: image: postgres:13.3 container_name: orthanc-postgres2 volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /home/hogehoge/Orthanc/DB2/:/var/lib/postgresql/data networks: orthanc_nw: ipv4_address: 192.168.10.14 restart: always 起動前に、その1で作ったネットワークを削除しておきます。 $ docker network rm orthanc_nw それでは docker compose でコンテナを起動させます。 $ cd ~/Orthanc $ docker-compose up -d Creating network "orthanc_orthanc_nw" with driver "bridge" Creating orthanc1 ... done Creating orthanc-postgres2 ... done Creating orthanc-postgres1 ... done Creating orthanc2 ... done  コンテナ起動成功です。 http://localhost:50010 (Orthanc1) と http://localhost:50020 (Orthanc2) にアクセスして Orthanc explorer が見えればOKです。 Orthanc1 にはすでにデータがあるはずですので、"Do lookup" をクリックして確認し、表示されたデータをクリックします。データの詳細が示されます。ここで orthanc2 にデータを送るために、 "Send to DICOM modality" をクリックします。 "Chose target" というダイアログが表示されます。  "DICOM modalities" の ORTHANC2 をクリックするとデータが送信され、Job の画面になります。http://localhost:50020 の Orthanc explorer で "Do lookup" をクリックすると、先程送信したデータが受信されているのが確認できます。  このようにして、2つの orthanc を一つの端末で同時に起動することができますので、試してみたいなと思ったことが自由にできます。基本的な動作確認や設定ファイルのデバッグなどに役立つと思います。 設定ファイルの検証の例  一例として、設定ファイルの一部の項目の動作を見てみましょう。 ~/Orthanc/Config2/orthanc.json "DicomAlwaysAllowStore" : true,  デフォルトでは、どの端末からも送られてきたデータを受け取るという設定になっています。この true を false に変更して、データを送ってみます。あらかじめ、http://localhost:50020 でデータを削除してから、コンテナを再起動して、もう一度 "DICOM modalities" の ORTHANC2 をクリックしてデータを送信してみます。  今回は転送できなくなりました。先程の設定が効いているようです。では受け取るにはどうするか。~/Orthanc/Config2/orthanc.json を編集します。 ~/Orthanc/Config2/orthanc.json // 下記の行を追加 (line 322) "ORTHANC1" : ["ORTHANC1", "192.168.10.11", 60010], "ORTHANC2" : ["ORTHANC2", "192.168.10.13", 60010] これで、先程のコンテナ再起動・データ転送コマンドを実行するとデータが受け取れたことがわかります。 このようにして、2つの orthanc を一つの端末で同時に起動することで、設定ファイルの項目調査という使い方ができます。次に紹介する REST API や Lua スクリプトの紹介でもそのような使い方をしています。 REST API Ortrhanc は "build-in REST API" を持っています。公式マニュアルはこちらです。 https://book.orthanc-server.com/users/rest.html それでは使ってみます。あらかじめ、http://localhost:50020 でデータを削除しておきます。下記に走らせたコマンド例と結果を示します。 # 20130101-20210101 の期間のデータを検索する $ curl -u alice:alicePassword -v \ http://localhost:50010/modalities/ORTHANC1/query \ -d '{"Level":"Study","Query":{"StudyDate":"20130101-20210101"},"Normalize":false}' # 途中出力省略 {0c9ecd1c-007e-4656-8f0b-ffc3b3cec442 "ID" : "d97e5dd7-3a8d-4c27-a487-bc67d03061a9", "Path" : "/queries/d97e5dd7-3a8d-4c27-a487-bc67d03061a9" } # インスタンスの表示 $ curl -u alice:alicePassword --request GET --url \ http://localhost:50010/queries/d97e5dd7-3a8d-4c27-a487-bc67d03061a9/answers [ "0" ] # Orthanc2 へデータ送信 $ curl -u alice:alicePassword --request POST --url \ http://localhost:50010/queries/d97e5dd7-3a8d-4c27-a487-bc67d03061a9/retrieve \ --data ORTHANC2 { "Description" : "REST API", "LocalAet" : "ORTHANC1", "Query" : [ { "0008,0050" : "MOF5026", "0008,0052" : "STUDY", "0010,0020" : "583295", "0020,000d" : "1.113654.3.13.1026" } ], "RemoteAet" : "ORTHANC2" } こんな感じでデータの処理が可能です。 Lua スクリプト Orthanc は Lua スクリプトが利用できます。 Official web site http://www.lua.org/ 実は Orthanc を触るまでは聞いたことのない言語でした。こちらのサイトを参考にしました。 http://www.rtpro.yamaha.co.jp/RT/docs/lua/tutorial/index.html 公式のマニュアルはこちらです。 https://book.orthanc-server.com/users/lua.html 今回のデモの内容はこの内容にします。 - DICOM tag を表示する - データを Orthanc1 から Orthanc2 へ送信する - DICOM ファイルをローカルにエクスポートする ~/Orthanc/Config1/demo.lua を作成します。 ~/Orthanc/Config1/demo.lua function OnStoredInstance(instanceId, tags, metadata, origin) -- Show all dicom tags for key, val in pairs(tags) do print(key, val) end -- Send data to orthanc2 SendToModality(instanceId, 'ORTHANC2') print("Send data to ORTHANC2") -- Export data on the local directory local DirName = '/root/DicomData/' os.execute('mkdir -p "' .. DirName .. '"') local target_data = assert(io.open(DirName .. tags['SOPInstanceUID'] .. '.dcm', 'wb')) local dicom = RestApiGet('/instances/' .. instanceId .. '/file') target_data:write(dicom) target_data:close() end DICOM ファイルをエクスポートするディレクトリを作成します。 $ mkdir ~/Orthanc/ExportData データ出力先の指定のために ~/Orthanc/docker-compose.yml を、Lua スクリプトのソースコードを指定するために ~/Orthanc/Config1/orthanc.json をそれぞれ編集します。 ~/Orthanc/docker-compose.yml # 次の行を追加する (line 22) - /home/hogehoge/Orthanc/ExportData/:/root/ ~/Orthanc/Config1/orthanc.json // 次の行を追加する (line 47) "/etc/orthanc/demo.lua" 現在動作しているコンテナを停止して、再度起動させます。 $ docker stop orthanc1 orthanc2 orthanc-postgres1 orthanc-postgres2 $ docker rm orthanc1 orthanc2 orthanc-postgres1 orthanc-postgres2 $ cd ~/Orthanc/ $ docker-compose up -d データの転送状況を確認するために、 http://localhost:50020 からデータをすべて削除しておきます。次に、手動で http://localhost:50010 にあるデータを自分自身 (Orthanc1) に転送します。これで Lua スクリプトが動作したはずです。結果は下記のようにログに表示されます。 $ docker logs -f orthanc1 (データ受信までの部分は省略) 0813 00:09:00.536300 HttpServer.cpp:1238] (http) POST /modalities/ORTHANC1/store I0813 00:09:00.538883 JobsRegistry.cpp:724] New job submitted with priority 0: 643b03a9-b3df-4b29-949b-c9abcdedc196 I0813 00:09:00.539011 JobsEngine.cpp:133] (jobs) Executing job with priority 0 in worker thread 1: 643b03a9-b3df-4b29-949b-c9abcdedc196 I0813 00:09:00.539103 DicomModalityStoreJob.cpp:61] Sending instance b53d548b-392f4581-24ac12a6-efcb04ec-f13a5415 to modality "ORTHANC1" I0813 00:09:00.552187 DicomAssociation.cpp:274] (dicom) Opening a DICOM SCU connection without DICOM TLS from AET "ORTHANC1" to AET "ORTHANC1" on host 192.168.10.11:60010 (manufacturer: Generic, timeout: 10s) I0813 00:09:00.554891 CommandDispatcher.cpp:332] (dicom) Association Received from AET ORTHANC1 on IP 192.168.10.11 I0813 00:09:00.567950 main.cpp:311] Incoming connection from AET ORTHANC1 on IP 192.168.10.11, calling AET ORTHANC1 I0813 00:09:00.568268 CommandDispatcher.cpp:663] (dicom) Association Acknowledged (Max Send PDV: 16372) to AET ORTHANC1 on IP 192.168.10.11 I0813 00:09:00.569806 main.cpp:344] Incoming Store request from AET ORTHANC1 on IP 192.168.10.11, calling AET ORTHANC1 I0813 00:09:00.577605 HttpServer.cpp:1238] (http) GET /system I0813 00:09:00.587953 ServerContext.cpp:628] Already stored W0813 00:09:00.588318 LuaContext.cpp:93] Lua says: ContrastBolusAgent, W0813 00:09:00.588357 LuaContext.cpp:93] Lua says: EchoTime, 11.000000 W0813 00:09:00.588374 LuaContext.cpp:93] Lua says: BitsAllocated, 16 (一部略) W0813 00:09:00.588608 LuaContext.cpp:93] Lua says: SOPInstanceUID, 1.113654.5.15.1504 (一部略) 0813 00:09:00.589455 LuaContext.cpp:93] Lua says: Send data to ORTHANC2 I0813 00:09:00.604404 JobsRegistry.cpp:724] New job submitted with priority 0: 5384b4e9-4b12-4506-9388-aef0ddc75ee1 I0813 00:09:00.604560 JobsEngine.cpp:133] (jobs) Executing job with priority 0 in worker thread 1: 5384b4e9-4b12-4506-9388-aef0ddc75ee1 I0813 00:09:00.604827 StoreScuOperation.cpp:59] Lua: Sending instance b53d548b-392f4581-24ac12a6-efcb04ec-f13a5415 to modality "ORTHANC2" I0813 00:09:00.608776 DicomAssociation.cpp:274] (dicom) Opening a DICOM SCU connection without DICOM TLS from AET "ORTHANC1" to AET "ORTHANC2" on host 192.168.10.13:60020 (manufacturer: Generic, timeout: 10s) I0813 00:09:00.612131 HttpServer.cpp:1238] (http) GET /jobs/643b03a9-b3df-4b29-949b-c9abcdedc196 I0813 00:09:00.644702 SequenceOfOperationsJob.cpp:340] Executing the trailing timeout in the sequence of operations I0813 00:09:05.644874 SequenceOfOperationsJob.cpp:347] The sequence of operations is over I0813 00:09:05.645085 JobsRegistry.cpp:498] Job has completed with success: 5384b4e9-4b12-4506-9388-aef0ddc75ee1 I0813 00:09:05.645187 TimeoutDicomConnectionManager.cpp:94] (dicom) Closing inactive DICOM association with modality: ORTHANC2  ログを見ると、 DICOM tag がズラッと並んでいることがわかります。そのうちの SOPInstanceUID は 1.113654.5.15.1504 となっています。 ~/Orthanc/ExportData/DicomData の中に 1.113654.5.15.1504.dcm が出力されているはずです。そして、 http://localhost:50020 には先程のデータが転送されているはずです。  このように Lua スクリプトでデータの処理ができます。このほかにデータの編集などもできるようです。 まとめ  その1の続きとして、ほんのちょっと発展させたことを備忘録的にまとめてみました。今回やったことは Orthanc が持つ本来の性能のほんの一部だと思います。これ以上のことをする予定はないのでここで手を止めますが、 orthanc.json を眺めるだけでもいろいろな設定ができそうだということがわかります。 Python も使えるようになっています。DICOM の worklist も対応しているようです。うまくやれば、ユーザーの希望をあらかた叶えるシステムになるんじゃないでしょうか。  Orthanc のフォーラムも非常に活発で、しかも作者が丁寧に回答しておられます。ますます多機能になりつつ性能も向上していくようです。今後が楽しみなソフトウエアです。 おわり
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む