开发者问题收集

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

2018-10-10
7348

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

Starting integration-tests_mysql_1 ... error

ERROR: for integration-tests_mysql_1 Cannot start service mysql: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"./wait-for-it.sh\": stat ./wait-for-it.sh: no such file or directory": unknown

ERROR: for mysql Cannot start service mysql: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"./wait-for-it.sh\": stat ./wait-for-it.sh: no such file or directory": unknown ERROR: Encountered errors while bringing up the project.

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

2个回答

此处的问题在于,您尝试执行不属于您镜像的某些内容。您告诉 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 而不超时。

twoTimesAgnew
2018-10-10

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

Mr3381
2018-11-26