gpt4 book ai didi

database - 如何使 Docker Compose 服务构建依赖于另一项服务?

转载 作者:搜寻专家 更新时间:2023-10-30 20:47:45 24 4
gpt4 key购买 nike

这就是我的意思。我如何编写 docker-compose.yaml 文件,以便在“构建”其中一项服务时,它首先运行另一项服务?

我会尝试更加具体。我正在尝试使用数据库库 JOOQ 构建 Java 应用程序,它希望在构建时连接到数据库以生成与数据库表相对应的 Java 类。我想要 Dockerfile(s) 和 docker-compose.yaml 文件的某种组合,以便以下内容大致按以下顺序发生。

  1. 启动“数据库”服务(在我的例子中,使用 postgres 图像)。
  2. 数据库是用我的开发库中的 SQL 脚本初始化的。
  3. 我的“web”服务的构建阶段运行,它使用同一个 repo 中的 Dockerfile,它调用 Gradle 构建,它告诉 JOOQ 连接到在步骤 1 中启动的数据库服务。这会生成 Java 文件,编译它们,并完成构建容器的所有其他工作。
  4. 启动“web”服务,连接到第 1 步中启动的数据库服务。

这是我正在使用的 docker-compose.yaml 文件

version: '3.7' 
services:
postgres:
image: postgres:10.5-alpine
restart: always
ports:
- "6432:5432"
environment:
POSTGRES_DB: flashtools
POSTGRES_USER: flashtools
POSTGRES_PASSWORD: flashtools
volumes:
- ./src/main/scripts/01_init.sql:/docker-entrypoint-
initdb.d/01_init.sql
web:
build: .
network_mode: host
depends_on:
- postgres
ports:
- "8080:8080"

我会用更多细节充实它,但希望我的问题非常简单明了。

最佳答案

这现在应该(技术上)成为可能:

2021-04-06 以来,在 版本 1.29.0 中(release note link)

使用 service_completed_successfully 条件(这是一个“长格式” depends_on 选项):

Long syntax:

The long form syntax enables the configuration of additional fields that can't be expressed in the short form.

  • condition: condition under which dependency is considered satisfied
    • service_completed_successfully: specifies that a dependency is expected to run to successful completion before starting a dependent service.

(source - emphasis added)

长语法示例:

depends_on:
service_name:
condition: service_completed_successfully

更新您的 docker-compose.yml 文件:

您需要进行以下更改:

  • 将您的撰写版本提高到 3.8
  • 将新的 service_completed_successfully 条件添加到您的 depends_on
version: "3.8"
services:
postgres:
image: postgres:10.5-alpine
restart: always
ports:
- "6432:5432"
environment:
POSTGRES_DB: flashtools
POSTGRES_USER: flashtools
POSTGRES_PASSWORD: flashtools
volumes:
- ./src/main/scripts/01_init.sql:/docker-entrypoint-initdb.d/01_init.sql
web:
build: .
network_mode: host
depends_on:
postgres:
condition: service_completed_successfully
ports:
- "8080:8080"

您可能还需要使用多阶段 Dockerfile:

( multi-stage build info )

多阶段构建通常用于精简最终 Docker 镜像,但它也可用于运行脚本并在完成构建之前创建所需的“工件”。

如果没有看到您的确切 Dockerfile,很难提出这个建议,但我认为值得一提的是您可能还需要使用它。

关于database - 如何使 Docker Compose 服务构建依赖于另一项服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52788472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com