Интегрируйте два приложения для докеров - Docker compose и Docker run

Я пытаюсь интегрировать два приложения. В настоящее время у меня есть файл docker-compose с двумя службами и еще одна команда docker - run для запуска другой службы. Основываясь на моей конфигурации ниже, я ожидаю, что OHIF Viewer, работающий на порте 3030, и Orthanc, работающий на 8042, будут взаимосвязаны. Я имею в виду, что если я загружу изображение в Orthanc, я смогу увидеть его в программе просмотра OHIF. В настоящее время я могу просматривать как Orthanc, так и программу просмотра OHIF в их соответствующих портах, но я не вижу никакого взаимодействия между ними. Пример: я не вижу свое изображение (загруженное в Orthanc) в OHIF Viewer.

Я думал, что за это взаимодействие отвечает файл dockersupport-app.json, поскольку он содержит информацию о порте 8042 и используется в разделе «Volumes» файла docker-compose.yml.

Вот мой файл для создания докеров

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 для запуска Orthanc через порт 8042 выглядит так, как показано ниже.

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

Не могли бы вы помочь мне, как я могу интегрировать эти два? Вышеупомянутые файлы / коды - это информация, которая у меня есть.


person The Great    schedule 15.06.2019    source источник
comment
Откуда берется IP-адрес 172.x.x.x? Можете ли вы добавить третий контейнер в тот же docker-compose.yml файл? (Это не обязательно, но упрощает работу.)   -  person David Maze    schedule 15.06.2019


Ответы (1)


Конфигурация не работает в основном потому, что приложение не читает 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

person Mihai    schedule 16.06.2019
comment
Привет, Михай !!, Мы общались в прошлом году, и вы помогли мне с моими вопросами о докере. Требуется помощь. Но, похоже, я пропустил ваш идентификатор телеграммы ... Не могли бы вы написать мне на [email protected]? - person The Great; 21.06.2020
comment
В любом случае я буду публиковать свои вопросы только на SO. - person The Great; 21.06.2020
comment
Вы можете отправить сообщение в Telegram: @MexHix. Я вижу, вы удалили свой аккаунт в Telegram;) - person Mihai; 21.06.2020
comment
связался с вами в телеграмме - person The Great; 22.06.2020