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

时间:2018-10-10 15:50:02

标签: docker docker-compose

我正在尝试在docker-compose.yaml中使用flex来等待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 ...错误

     

错误:对于Integration-tests_mysql_1无法启动服务mysql:OCI   运行时创建失败:container_linux.go:348:启动容器   进程导致“ exec:\”。/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文件位于同一级别,因此我不明白为什么找不到该文件。

2 个答案:

答案 0 :(得分:3)

您的问题是,您正在尝试执行不属于图像的内容。您要告诉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。

答案 1 :(得分:2)

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