😀

OSS DICOM Server Orthancの検証メモ

2023/03/09に公開

OSS DICOM Server 「Orthanc」をDockerで動かしてみた記録です。あまり日本語の情報がないのでまとめてみました。
公式ドキュメント:https://book.orthanc-server.com/

動作検証環境

OS: Ubuntu20.04
Docker: 23.0.1
Docker Compose: v2.16.0(plugin)

まずは単体で動かしてみる

公式のdockerイメージjodogne/orthancを動かす
https://book.orthanc-server.com/users/docker.html
ドキュメントの通りコマンドを実行。

$ docker run -p 4242:4242 -p 8042:8042 --rm jodogne/orthanc:1.11.0

http://orthanc_host:8042/ にアクセスし、ユーザ名/パスワードに「orthanc/orthanc」と入力すると以下のような画面が表示される。

この状態ではdockerコンテナを停止するとデータも無くなるため、外部ボリュームをマウントするなどしてデータ永続化の設定をする必要がある。
http://orthanc_host部分は自身の環境等に合わせ読み替えてください

Docker Composeで起動

設定のカスタマイズ

コンテナイメージ内の設定ファイルを取得

$ mkdir ~/Orthanc
$ cd ~/Orthanc
$ docker run --rm --entrypoint=cat jodogne/orthanc-plugins:1.11.0 /etc/orthanc/orthanc.json > orthanc.json

テキストエディタでorthanc.jsonを編集する。変えたのは以下の部分。

orthanc.json
//HTTPアクセス(Web画面)のポート番号
"HttpPort" : 18042,
//AEタイトル
"DicomAet" : "ORTHANCTEST",
//DICOMポート番号
"DicomPort" : 50444,
//ログインユーザ
"RegisteredUsers" : {
   "test" : "test"
 },

docker-compose.ymlの作成

公式ドキュメントに倣って、以下のように作成。公式はsecretsを使っているが、volumesでマウントしても動作する。後々、PostgreSQLへの接続なども考慮しnetworkを作成している

docker-compose.yml
version: '3'

networks:
  develop_nw:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.50.0/24
services:
  orthanc:
    image: jodogne/orthanc-plugins:1.11.0
    container_name: orthanc-sv
    ports:
      - 50444:50444
      - 18042:18042
    volumes:
      - ./orthanc.json:/etc/orthanc/orthanc.json:ro
    environment:
      - ORTHANC_NAME=Orthanc
    networks:
      develop_nw:
        ipv4_address: 192.168.50.11

docker-compose.ymlを保存したら、以下のコマンドで起動する。

$ docker compose up -d

アクセスURLが http://orthanc_host:18042/ ログインユーザ名/パスワードが「test/test」になっていることを確認。

データベースをPostgreSQLに変更

PostgreSQLのdockerコンテナを実行

公式のようにコマンドでやっても良いが、後々統合してしまうのでdocker-compose.ymlにPostgreSQL用の設定を加える。DB初期化などを行うので一旦orthancの部分はコメントアウトしておく。

docker-compose.yml
version: '3'

networks:
  develop_nw:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.50.0/24

services:
#  PostgreSQLだけ動かすので一旦コメントアウトする
#  orthanc:
#    image: jodogne/orthanc-plugins:1.11.0
#    container_name: orthanc-sv
#    (省略)
postgresql:
    image: postgres:13.9
    container_name: orthanc-db
    ports:
      - 15432:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      develop_nw:
        ipv4_address: 192.168.50.31

Docker Composeで起動する。

$ docker compose up -d

データベースを初期化する

$ docker run -it --link orthanc-db:postgres --net=orthanc_develop_nw --rm postgres:13.9 sh -c 'echo "CREATE DATABASE orthanc;" | psql -h 192.168.50.31 -U postgres'

以下の出力があるので、POSTGRES_PASSWORDで設定したパスワードを入力する

Password for user postgres:

Docker ComposeでOrthancとPostgreSQLを起動

docker-compose.ymlのコメントアウトを外し、depends_onにpostgresqlを指定しDBの起動後にorthancが起動するように設定

docker-compose.yml
version: '3'

networks:
  develop_nw:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.50.0/24

services:
  orthanc:
    image: jodogne/orthanc-plugins:1.11.0
    container_name: orthanc-sv
    ports:
      - 50444:50444
      - 18042:18042
    volumes:
      - ./orthanc.json:/etc/orthanc/orthanc.json:ro
    environment:
      - ORTHANC_NAME=Orthanc
    networks:
      develop_nw:
        ipv4_address: 192.168.50.11
    depends_on:
      - postgresql
postgresql:
    image: postgres:13.9
    container_name: orthanc-db
    ports:
      - 15432:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      develop_nw:
        ipv4_address: 192.168.50.31

orthanc.jsonにPostgresSQL接続設定を追加する

orthanc.json
"PostgreSQL":{
  "EnableIndex":true,
  "EnableStorage":true,
  "Host":"192.168.50.31",
  "Port":5432,
  "Database":"orthanc",
  "Username":"postgres",
  "Password":"postgres"
}

Docker Composeで起動

$ docker compose up -d

http://orthanc_host:18042/にアクセスできない。

$ docker ps -a

orthancコンテナの状態を確認すると Exited (139)となり起動していなかった

Orthancがexited with code 139で起動しない件

orthancコンテナのログ出力をtraceに変えてみたところ、PostgresSQLプラグイン部分で落ちているようだった

orthanc-sv  | W1223 06:34:08.166648 PluginsManager.cpp:258] Registering plugin 'postgresql-storage' (version 4.0)
orthanc-sv  | T1223 06:34:08.166730 OrthancPlugins.cpp:5638] (plugins) Calling service 7 from plugin /usr/local/share/orthanc/plugins/libOrthancPostgreSQLStorage.so
orthanc-sv  | T1223 06:34:08.166756 OrthancPlugins.cpp:5638] (plugins) Calling service 13 from plugin /usr/local/share/orthanc/plugins/libOrthancPostgreSQLStorage.so
orthanc-sv  | T1223 06:34:08.167479 OrthancPlugins.cpp:5638] (plugins) Calling service 13 from plugin /usr/local/share/orthanc/plugins/libOrthancPostgreSQLStorage.so
orthanc-sv exited with code 139

Docker Composeを使用せずコマンドでpostgresql→orthancの順で起動してやるとOKだった。

Docker Compose起動順制御

postgresqlが完全に起動しきらないうちに、orthancが起動してエラーになっているのではないかと思い、Google検索してみると次のDocker公式ドキュメントに行きついた。
https://docs.docker.jp/compose/startup-order.html
ドキュメントの通りwait_for_it.shを仕掛けてみるもうまく行かなかったため、さらに調べるとDocker Composeにservice_healthyなるものがあることが分かった。
早速、docker-compose.ymlを変更してみた。
orthancコンテナのdepends_onを変更

    depends_on:
      postgresql:
        condition: service_healthy

postgresqlコンテナにhealth_checkを追加

    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 1s
      retries: 5

変更後に起動してみると、Orthancもきちんと起動した。
ただ、postgresqlコンテナが、以下のようなエラーログを出力しており非常に気持ち悪い。

orthanc-db  | 2022-12-23 07:10:42.670 UTC [69] FATAL:  role "root" does not exist

pg_isreadyにユーザ指定できるようなので、

test: ["CMD-SHELL", "pg_isready -U postgres"]

と変更。これでエラーが出なくなった。
docker-compose.yml完成形は下記の通り

docker-compose.yml
version: '3'

networks:
  develop_nw:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.50.0/24
services:
  orthanc:
    image: jodogne/orthanc-plugins:1.11.0
    container_name: orthanc-sv
    ports:
      - 50444:50444
      - 18042:18042
    volumes:
      - ./orthanc.json:/etc/orthanc/orthanc.json:ro
      - ./orthanc_data:/var/lib/orthanc/db
    environment:
      - ORTHANC_NAME=Orthanc
    networks:
      develop_nw:
        ipv4_address: 192.168.50.11
    depends_on:
      postgresql:
        condition: service_healthy
  postgresql:
    image: postgres:13.9
    container_name: orthanc-db
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 1s
      retries: 5
    ports:
      - 15432:5432
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      develop_nw:
        ipv4_address: 192.168.50.31

参考情報

https://qiita.com/qweasdzxc/items/60c26cd59c0936ff764a
https://qiita.com/qweasdzxc/items/95d4900d1f1e2fe30596
https://zenn.dev/togana/articles/12c18869a4eb29
https://kobe-systemdesign.work/2022/03/29/dockerpostgresqlのヘルスチェックを実行する際の注意点/

Discussion