配置不起作用主要是因为应用程序未读取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



