在创建其他服务之前等待 docker compose 中的 mysql 服务准备就绪

gom*_*sha 0 docker docker-compose

我试图用等待换它在我docker-compose.yaml等待的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
Run Code Online (Sandbox Code Playgroud)

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

启动集成测试_mysql_1 ...错误

错误:对于集成测试_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文件处于同一级别,所以我不明白为什么找不到它。

two*_*new 5

您的问题是您正在尝试执行不属于您的图像的内容。你告诉 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
Run Code Online (Sandbox Code Playgroud)

然后您将替换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"
...
Run Code Online (Sandbox Code Playgroud)

其中 -t 0 将在没有超时的情况下等待 mysql。