在创建其他服务之前,等待 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 运行此脚本时出现此错误:
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
文件位于同一级别,因此我不明白为什么找不到它。
此处的问题在于,您尝试执行不属于您镜像的某些内容。您告诉 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 而不超时。
您可以使用 docker depends_on 选项控制服务启动顺序。