【问题标题】:Wait for mysql service to be ready in docker compose before creating other services在创建其他服务之前,等待 docker compose 中的 mysql 服务准备好
【发布时间】:2019-03-15 14:22:36
【问题描述】:

我试图在我的docker-compose.yaml 中使用wait-for-it 来等待mysql 准备好,然后再创建依赖它的服务。这是我的docker-compose.yaml:

version: '3.5'

services:
  mysql:
    image: mysql:5.6
    ports:
      - "3307:3306"
    networks:
      - integration-tests
    environment:
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=root
      - MYSQL_ROOT_PASSWORD=mypassword
    entrypoint: ./wait-for-it.sh mysql:3306
networks:
  integration-tests:
    name: integration-tests

尝试使用 docker-compose 运行时出现此错误:

启动 integration-tests_mysql_1 ... 错误

ERROR: for integration-tests_mysql_1 无法启动服务 mysql: OCI 运行时创建失败:container_linux.go:348:启动容器 进程导致“exec:\”./wait-for-it.sh\”:stat ./wait-for-it.sh:否 这样的文件或目录”:未知

错误:对于 mysql 无法启动服务 mysql:OCI 运行时创建 失败:container_linux.go:348:启动容器进程导致 "exec: \"./wait-for-it.sh\": stat ./wait-for-it.sh: 没有这样的文件或 目录”:未知错误:在调出 项目。

wait-for-it.sh 脚本与我的docker-compose.yaml 文件处于同一级别,所以我不明白为什么找不到它。

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    您的问题是您正在尝试执行一些不属于您的图像的内容。你告诉 docker 从 mysql:5.6 创建一个不包含 wait-for-it.sh 的容器,然后你告诉它通过启动 wait-for-it.sh 来启动容器。

    我建议您创建自己的包含以下内容的图像:

    #Dockerfile
    FROM mysql:5.6
    
    COPY wait-for-it.sh /wait-for-it.sh
    RUN chmod +x /wait-for-it.sh
    

    然后您将mysql:5.6 替换为您的图像,您应该能够执行wait-for-it.sh。我也会通过命令而不是入口点来执行它:

    #docker-compose.yml
    ...
    mysql:
      image: yourmysql:5.6
      command:  bash -c "/wait-for-it.sh -t 0 mysql:3306"
    ...
    

    其中 -t 0 将等待 mysql 而不会超时。

    【讨论】:

    • 谢谢!这意味着我现在必须为该特定版本的 mysql 创建一个单独的映像,只是因为我想运行 wait-for-it.sh。当我想运行更新版本的 mysql 时,我必须制作一个全新的 Docker 映像,这样我才能运行该脚本。好像有点矫枉过正。在我的主应用程序启动之前,我有多个依赖服务需要等待,这会增加很多开销。如果不创建单独的图像就无法运行该脚本吗?
    • 你说得对,它确实增加了开销,但这是正确的做法。另一种选择是创建一个卷绑定来实质上挂载您的代码,虽然这在开发环境中是一个有效的解决方案,但您不希望在生产环境中使用它。使用您自己的图像可以让您更好地控制您的应用程序。即使您现在可能只使用默认图像,但您可能需要添加更多功能/模块/其他任何内容。你可以从 wait-for-it.sh 的官方 repo 中查看这个link
    • 经过一番研究,我发现可能有一种我不知道的新方法可以实现这一目标。 Depends_on 现在可以使用运行状况检查条件。看看这个article,如果你最终让它与你的用例一起工作,我很想听听它!
    • 是的,我也看到了健康检查的方法。那篇文章使用了postgres。我找不到适用于 mysql 的健康检查测试。看看stackoverflow.com/questions/42567475/…。
    【解决方案2】:

    您可以使用 docker depends_on 选项控制服务启动顺序。

    【讨论】:

    • 是的,我知道depends_on,但它的问题是它不会在启动下一个服务之前等待启动依赖服务。这就是我尝试使用 wait-for-it 的原因。
    猜你喜欢
    • 2019-02-18
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多