我正在尝试集成两个应用程序。目前,我有一个包含两个服务的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

07-24 13:08