我正在尝试在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
文件位于同一级别,因此我不明白为什么找不到该文件。
答案 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选项控制服务的启动顺序。