docker を使って flask

やろうとしていること

docker を使って flask を動かして、dicom ファイルが見れないかと思いました。

現段階で内視鏡画像(.jpg)を dicom ファイルに変換するのは簡単なのですが、dcm4chee にインポートしようとするとエラーになります。

おそらく、SOPInstanceUID などの設定が必要なのでしょう。

しかし、それはいずれ解決できると思っています。

インポートできるような dicom ファイルが作れればそれを dcm4chee にインポートして、dcm4chee でも十分閲覧できるわけですが、私が以前から感じていたのは、データベースがクラッシュしたらどうするんだろう?、ということでした。

dcm4chee 全体をバックアップしようしたことがありますが、dcm4chee はデータベースが巨大すぎて、バックアップが簡単にはできないようです。

データベースがクラッシュすることはないのかもしれませんが、それを動かしているコンピュータがクラッシュすることはありうることです。その時は、バックアップがないと相当面倒なことになります。

私がやろうとしているのは、サーバー内の python に dicom ファイルのタグ情報を読ませてデータベースとファイル構造を作成し、クライアントの flask からアクセスして、閲覧したい dicom ファイルをクライアントにダウンロードして weasis で閲覧するというものです。

これは pacs とは呼べない代物ですが、感覚的には pacs より簡単で、実際にほとんど同じように動きます。

データベースは、基本的に何でもいいと思いますが、テーブルは1個しかないシンプルなもので mysql にしています。
ファイルサイズは極端に小さいためエクスポート、バックアップがとても簡単です。

テーブルはこんな感じです。実際には氏名もあります。

ネットワーク構造

現在、病院のネットワーク構造は以下のようになっています。
(これは dicom 関連だけです。内視鏡や検査データのネットワークは別にあります。)

現在、linux mint から windows 7 の dcm4chee を使って dicom ファイルを閲覧できています。

DS718+ の virtualmachine に linux mint がインストールされており、その中で python が放射線科の dicom ファイルの中から順番に処理をして、そのタグ情報をデータベースに記録して、新しいファイル構造を DS718+ の HDD に蓄積しています。

ローカルの linux mint に flask を設定して、DS 718+ の mysql にアクセスしデータ一覧を表示して、検査IDなどを選ぶと dicom ファイルが linux mint にダウンロードされて weasis が起動します。

これは自宅ではできているのですが、病院ではまだできていません。
コンピュータがネット接続されていないことや、設定がやや面倒なためです。

でも、docker 内に flask を設定できるのであれば、自宅で設定しておいて、その docker file を病院の linux mint に簡単に持っていけるのではないかと考えました。

docker + flask で hello world

例によって、hello world から。
ここを参考にしました。

構造


~/test
└── docker
    └── flask
        ├── Dockerfile
        └── app
            ├── index.py
            └── templates
                ├── index.html
                └── test.html
Dockerfile

FROM python:alpine
WORKDIR /app
COPY ./app /app
RUN pip install Flask
CMD ["python", "index.py"]
index.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():  
    values = { "name": "Taro"}  
    return render_template('index.html', data=values)

@app.route("/test")
def test():  
    values = { "message":"Hello! This is test page." }  
    return render_template('test.html', data=values)

if __name__ == "__main__":  
    app.run(host="0.0.0.0", port=80, debug=True)
index.html
<!DOCTYPE html>
<html lang="ja">
<head> 
<meta charset="utf-8">  
<title>Flask</title>
</head>
<body>  
<h1>Welcome to Flask!</h1>  
<p>Hello, {{ data.name }}</p>
</body>
</html>
test.html
<!DOCTYPE html>
<html lang="ja">
<head>  
<meta charset="utf-8">  
<title>Test Page</title>
</head>
<body>  
<h1>Test Page</h1>  
<p>{{ data.message }}</p>
</body>
</html>

Dockerコンテナイメージをビルドする


cd ~/test/docker/flask/
docker image build -t flask .

コンテナを起動する


docker run -p 5000:80 -v ${PWD}/app:/app -d flask

ブラウザからコンテナにアクセス

ブラウザのアドレスバーに「http://localhost:5000/」と打ち込むと、

ブラウザのアドレスバーに「http://localhost:5000/test」と打ち込むと、

docker のコマンド

docker 一覧(停止しているものを含む)。


docker ps -a

起動している docker リスト。


docker ps

image リスト。


docker images

docker 起動。


docker start 0b5aad08487b

docker の停止。


docker stop 0b5aad08487b

コンテナ削除。


docker rm -f 0b5aad08487b

イメージ削除。


docker rmi 0b5aad08487b

コンテナ一括削除。


docker system prune

イメージ一括削除。


docker images -aq | xargs docker rmi

docker コンテナ内部に入ります。(コンテナは起動している必要があります。)


docker container exec -it ubuntu1804 bash

コンテナからイメージを作成。


docker commit ubuntu1804 ubu01

イメージからコンテナを作成して入る。


docker container run -it ubu01

permission denied

sudo docker としないと permission denied になります。


docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.

docker.sock の変更をします。


cd /var/run

sudo chown user:user docker.sock