当前位置: 首页 > 面试题库 >

集成两个Docker应用-Docker compose和Docker run

邢嘉祯
2023-03-14
问题内容

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



 类似资料:
  • 问题内容: 我正在尝试在docker-compose中安装一个卷以Apache镜像。问题是,我的docker中的apache运行在,但是挂载的目录在之下创建。如何指定挂载目录的用户? 我试图运行命令。但它说 我希望能够指定安装它的用户。有办法吗? 问题答案: 首先确定用户的uid : 然后,在您的Docker主机上,使用uid(在本示例中为100)更改已安装目录的所有者: 动态扩展 如果您正在使用

  • Spring integration提供了非反应的入站/出站WebSocket适配器,简单地说,它通过内部容器将会话与id相关联,您对消息进行一些处理,在出站时,它检查消息头是否有会话id,并通过该会话发送。 现在,Spring通过org.springframework.web.reactive.socket.WebSocketSession和其他类提供了反应性WebSocket支持,我想知道在反

  • 让spring集成应用程序具有入站http网关和出站http网关,在我想要缓存的两个网关之间,以避免不必要的请求。我唯一的解决方案是在它之后添加带缓存的拦截器和路由器,将cahced结果路由回回复通道,而非缓存的路由回出站,但这个解决方案对我来说似乎很棘手和丑陋。当入站网关具有相同的请求和应答通道时,带缓存的拦截器也可以正常工作(当返回具有相同标头但不同负载的新消息时,它被视为应答),但我不能使用

  • Docker containers are available that contain the complete PX4 development toolchain including Gazebo and ROS simulation: px4io/px4-dev: toolchain including simulation px4io/px4-dev-ros: toolchain incl

  • Rax SSR 应用也支持与传统 Node 应用进行集成。工作流程大致分为两个部分: 在 Rax SSR 应用中开发页面逻辑,分别构建为 Server 和 Client 端的产物 在 Node 应用中,调用 Server 端产物进行渲染 构建 在项目根目录下执行 npm run build ,即可进行项目构建。 构建产物与 app.json 中路由配置的对应关系如下: routes 配置: 1[

  • TIP 目前,Weex 支持以下 ABI: x86 armeabi-v7a arm64-v8a 在执行以下步骤之前,请先确认您的Android开发环境是ok的。 JAVA环境, jdk7+ Android Studio NDK r18、Cmake 3.9.0+ (可选项:如果需要编译WEEX源码,需要NDK环境支持) 1. 设置gradle依赖 TIP 从 0.28.0 开始,Weex 每次 Re