如何在多个 Docker Compose 组之间共享单个 Docker 数据库服务?

问题描述 投票:0回答:1

我有一个由 Web 服务器和 Oracle 数据库组成的 Docker Compose 组。 我仅将其用于开发,而不是生产。 Web 服务器依赖于 Oracle,因此在启动之前等待 Oracle。

version: '3.9'

services:
  frontend:
    image: "${FRONTEND_IMAGE_TAG}"
    env_file:
      - .env
    volumes:
      - .:/var/www/
    ports:
      - ${httpsport}
    restart: always  
    depends_on: 
      oracle:
          condition: service_healthy      

  oracle:
    image: container-registry.oracle.com/database/enterprise:${ORACLE_VERSION}
    env_file:
      - .env
    ports:
      - ${ORACLE_LISTEN_PORT}:1521
      - ${ORACLE_TCPS_PORT}:2484
      - ${ORACLE_EM_PORT}:5500
    volumes:
      - ${ORACLE_ORADATA}:/opt/oracle/oradata
      - ${ORACLE_TRANSFER}:/opt/oracle/transfer

只要我只运行组的一个实例,它就可以很好地工作。但通常在开发过程中,我想运行多个开发组,例如

cd /web/dev
docker compose up -d

cd /web/test
docker compose up -d

这里的问题是,它将尝试运行第二个 Oracle 数据库,我绝对不希望发生这种情况,因为我正在使用卷来保存数据(而且这似乎对机器造成了不必要的巨大负载)。 我只想运行 Oracle Docker 容器一次,并在第二次及后续尝试运行我的 Compose 组时共享它。

我正在考虑的一些方法:

  • 使用 Docker Network 将 Oracle 拆分为自己的服务。然后我必须找出一种方法来检查 Oracle 服务是否已启动并正在运行,并在未启动时启动它等。似乎不清楚这将如何工作

  • 使用Docker Compose extends来拆分Oracle。我认为这会和以前的方法有同样的问题

  • 也许编写一些 shell 脚本来进行检查并启动 Oracle 服务。不过我不喜欢这样做,感觉 Docker 应该有一个内置的解决方案

有一个 Github 问题,很多人请求此功能 来自 Docker。在更新之前我很想听听一些 解决方法。

docker docker-compose docker-networking
1个回答
0
投票

最后,我将 Docker Compose 文件分成 2 个文件,一个用于在自己的网络上运行的 Oracle,另一个用于前端。这并不理想,因为我必须在启动前端之前手动检查 Oracle 是否正常运行,但至少它解决了我运行多个前端的问题。将来我可以创建一个 shell 脚本来自动化该过程。

oracle.yaml 看起来像这样:

version: '3.9'

networks:
  mynetwork:
    
services:
  oracle:
    image: container-registry.oracle.com/database/enterprise:${ORACLE_VERSION}
    env_file:
      - .env
    ports:
      - ${ORACLE_LISTEN_PORT}:1521
      - ${ORACLE_TCPS_PORT}:2484
      - ${ORACLE_EM_PORT}:5500
    volumes:
      - ${ORACLE_ORADATA}:/opt/oracle/oradata
      - ${ORACLE_TRANSFER}:/opt/oracle/transfer
    networks:
      - mynetwork

前端看起来像这样:

version: '3.9'

services:
  frontend:
    image: "${FRONTEND_IMAGE_TAG}"
    env_file:
      - .env
    volumes:
      - .:/var/www/
    ports:
      - ${httpsport}
    restart: always 
© www.soinside.com 2019 - 2024. All rights reserved.