我正在尝试集成两个应用程序。目前,我有一个包含两个服务的docker-compose文件和另一个docker- run命令以启动另一个服务。根据下面的配置,我希望将互连在端口3030上运行的OHIF Viewer和运行在8042上的Orthanc。我的意思是,如果我在Orthanc中上传图片,则应该可以在OHIF查看器中看到它们。目前,我可以在各自的端口中同时查看Orthanc和OHIF查看器,但看不到它们之间的任何交互。例如:在OHIF Viewer中看不到我的图像(在Orthanc中上传)。
我认为dockersupport-app.json文件负责此交互,因为它具有有关端口8042的信息,并在docker- compose.yml文件的“卷”部分中使用。
这是我的docker-compose文件
version: '3.6' services: mongo: image: "mongo:latest" container_name: ohif-mongo ports: - "27017:27017" viewer: image: ohif/viewer:latest container_name: ohif-viewer ports: - "3030:80" environment: - MONGO_URL=mongodb://mongo:27017/ohif extra_hosts: - "pacsIP:172.xx.xxx.xxx" volumes: - ./dockersupport-app.json:/app/app.json
dockersupport-app.json如下图所示
{ "apps" : [{ "name" : "ohif-viewer", "script" : "main.js", "watch" : true, "merge_logs" : true, "cwd" : "/app/bundle/", "env": { "METEOR_SETTINGS": { "servers": { "dicomWeb": [ { "name": "Orthanc", "wadoUriRoot": "http://pacsIP:8042/wado", # these ports "qidoRoot": "http://pacsIP:8042/dicom-web", #these ports "wadoRoot": "http://pacsIP:8042/dicom-web", #these ports "qidoSupportsIncludeField": false, "imageRendering": "wadouri", "thumbnailRendering": "wadouri", "requestOptions": { "auth": "orthanc:orthanc", "logRequests": true, "logResponses": false, "logTiming": true } } ] }, "defaultServiceType": "dicomWeb", "public": { "ui": { "studyListDateFilterNumDays": 1 } }, "proxy": { "enabled": true } } } }] }
我的docker run命令在端口8042中启动Orthanc,如下所示
docker run -p 4242:4242 -p 8042:8042 --rm --name orthanc -v $(pwd)/orthanc/config/orthanc.json:/etc/orthanc/orthanc.json -v $(pwd)/orthanc/config/orthanc-db:/var/lib/orthanc/orthanc-db jodogne/orthanc- plugins /etc/orthanc --verbose
关于如何将这两者整合在一起,您能帮我吗?以上所有文件/代码是我所拥有的信息。
配置不起作用主要是因为应用程序未读取dockersupport-app.json。以下是基于项目在线文档的工作示例。
另一个问题是对dicomWeb服务器的访问。您正在使用pacsIP:8042,如果请求是从容器内部启动的,则可以。但这是一个javascript应用程序,该请求由主机上的浏览器启动。因此,应使用“ localhost”。
这是一个有效的配置:
version: '3.6' services: mongo: image: "mongo:latest" container_name: ohif-mongo ports: - "27017:27017" viewer: image: ohif/viewer:latest container_name: ohif-viewer ports: - "3030:80" environment: - MONGO_URL=mongodb://mongo:27017/ohif volumes: - ./config/default.js:/usr/share/nginx/html/config/default.js depends_on: - mongo - proxy orthanc: image: jodogne/orthanc-plugins ports: - "4242:4242" - "8042:8042" volumes: # Config - ./config/orthanc.json:/etc/orthanc/orthanc.json:ro # Persist data - ./volumes/orthanc-db/:/var/lib/orthanc/db/ command: "/etc/orthanc --verbose" proxy: image: nginx:1.15-alpine ports: - 8899:80 volumes: - ./config/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - orthanc restart: unless-stopped
在 config 文件夹中放置文件:
default.js
window.config = { // default: '/' routerBasename: '/', // default: '' relativeWebWorkerScriptsPath: '', servers: { dicomWeb: [ { name: 'DCM4CHEE', wadoUriRoot: 'http://localhost:8899/wado', qidoRoot: 'http://localhost:8899/dicom-web', wadoRoot: 'http://localhost:8899/dicom-web', qidoSupportsIncludeField: true, imageRendering: 'wadouri', thumbnailRendering: 'wadouri', requestOptions: { requestFromBrowser: true, auth: "orthanc:orthanc", "logRequests": true, "logResponses": true, "logTiming": true }, }, ], }, // Extensions should be able to suggest default values for these? // Or we can require that these be explicitly set hotkeys: [ // ~ Global { commandName: 'incrementActiveViewport', label: 'Next Image Viewport', keys: ['right'], }, { commandName: 'decrementActiveViewport', label: 'Previous Image Viewport', keys: ['left'], }, // Supported Keys: https://craig.is/killing/mice // ~ Cornerstone Extension { commandName: 'rotateViewportCW', label: 'Rotate Right', keys: ['r'] }, { commandName: 'rotateViewportCCW', label: 'Rotate Left', keys: ['l'] }, { commandName: 'invertViewport', label: 'Invert', keys: ['i'] }, { commandName: 'flipViewportVertical', label: 'Flip Horizontally', keys: ['h'], }, { commandName: 'flipViewportHorizontal', label: 'Flip Vertically', keys: ['v'], }, { commandName: 'scaleUpViewport', label: 'Zoom In', keys: ['+'] }, { commandName: 'scaleDownViewport', label: 'Zoom Out', keys: ['-'] }, { commandName: 'fitViewportToWindow', label: 'Zoom to Fit', keys: ['='] }, { commandName: 'resetViewport', label: 'Reset', keys: ['space'] }, // clearAnnotations // nextImage // previousImage // firstImage // lastImage { commandName: 'nextViewportDisplaySet', label: 'Previous Series', keys: ['pagedown'], }, { commandName: 'previousViewportDisplaySet', label: 'Next Series', keys: ['pageup'], }, // ~ Cornerstone Tools { commandName: 'setZoomTool', label: 'Zoom', keys: ['z'] }, ], };
nginx.conf
worker_processes 1; events { worker_connections 1024; } http { upstream orthanc-server { server orthanc:8042; } server { listen [::]:80 default_server; listen 80; # CORS Magic add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow_Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; location / { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow_Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } proxy_pass http://orthanc:8042; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; # CORS Magic add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow_Credentials' 'true'; add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH'; } } }
orthanc.json
{ "Name": "Orthanc inside Docker", "StorageDirectory": "/var/lib/orthanc/db", "IndexDirectory": "/var/lib/orthanc/db", "StorageCompression": false, "MaximumStorageSize": 0, "MaximumPatientCount": 0, "LuaScripts": [], "Plugins": ["/usr/share/orthanc/plugins", "/usr/local/share/orthanc/plugins"], "ConcurrentJobs": 2, "HttpServerEnabled": true, "HttpPort": 8042, "HttpDescribeErrors": true, "HttpCompressionEnabled": true, "DicomServerEnabled": true, "DicomAet": "ORTHANC", "DicomCheckCalledAet": false, "DicomPort": 4242, "DefaultEncoding": "Latin1", "DeflatedTransferSyntaxAccepted": true, "JpegTransferSyntaxAccepted": true, "Jpeg2000TransferSyntaxAccepted": true, "JpegLosslessTransferSyntaxAccepted": true, "JpipTransferSyntaxAccepted": true, "Mpeg2TransferSyntaxAccepted": true, "RleTransferSyntaxAccepted": true, "UnknownSopClassAccepted": false, "DicomScpTimeout": 30, "RemoteAccessAllowed": true, "SslEnabled": false, "SslCertificate": "certificate.pem", "AuthenticationEnabled": false, "RegisteredUsers": { "test": "test" }, "DicomModalities": {}, "DicomModalitiesInDatabase": false, "DicomAlwaysAllowEcho": true, "DicomAlwaysAllowStore": true, "DicomCheckModalityHost": false, "DicomScuTimeout": 10, "OrthancPeers": {}, "OrthancPeersInDatabase": false, "HttpProxy": "", "HttpVerbose": true, "HttpTimeout": 10, "HttpsVerifyPeers": true, "HttpsCACertificates": "", "UserMetadata": {}, "UserContentType": {}, "StableAge": 60, "StrictAetComparison": false, "StoreMD5ForAttachments": true, "LimitFindResults": 0, "LimitFindInstances": 0, "LimitJobs": 10, "LogExportedResources": false, "KeepAlive": true, "TcpNoDelay": true, "HttpThreadsCount": 50, "StoreDicom": true, "DicomAssociationCloseDelay": 5, "QueryRetrieveSize": 10, "CaseSensitivePN": false, "LoadPrivateDictionary": true, "Dictionary": {}, "SynchronousCMove": true, "JobsHistorySize": 10, "SaveJobs": true, "OverwriteInstances": false, "MediaArchiveSize": 1, "StorageAccessOnFind": "Always", "MetricsEnabled": true, "DicomWeb": { "Enable": true, "Root": "/dicom-web/", "EnableWado": true, "WadoRoot": "/wado", "Host": "127.0.0.1", "Ssl": false, "StowMaxInstances": 10, "StowMaxSize": 10, "QidoCaseSensitive": false } }
使用此配置运行:
docker-compose up -d viewer
上传图片:http:// localhost:8899
在查看器中查看图像:http:// localhost:3030