我有一个由 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 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