等待 mysql 服务在 docker compose 中准备就绪,然后再创建其他服务



我正在尝试在我的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 运行它时出现此错误:

开始集成tests_mysql_1...错误

错误:对于集成tests_mysql_1无法启动服务 mysql:OCI 运行时创建失败:container_linux.go:348:启动容器 进程导致"执行:\"./wait-for-it.sh\":统计./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 从不包含 wait-for-it.sh 的 mysql:5.6 创建一个容器,然后你告诉它通过启动 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 而没有超时。

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

相关内容

  • 没有找到相关文章

最新更新