Docker-compose检查mysql连接是否准备就绪

我试图确保我的应用程序容器不运行迁移/启动,直到数据库容器启动,并准备接受连接。

所以我决定使用健康检查,并取决于泊坞窗撰写文件v2中的选项。

在应用程序中,我有以下

app: ... depends_on: db: condition: service_healthy 

数据库另一方面有以下健康检查

 db: ... healthcheck: test: TEST_GOES_HERE timeout: 20s retries: 10 

我已经尝试了几个方法,如:

  1. 确保db DIR被创buildtest: ["CMD", "test -f var/lib/mysql/db"]
  2. 获取mysql版本: test: ["CMD", "echo 'SELECT version();'| mysql"]
  3. pingpipe理员(标记db容器是健康的,但似乎不是一个有效的testing) test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]

有没有人有这个解决scheme?

 version: "2.1" services: api: build: . container_name: api ports: - "8080:8080" depends_on: db: condition: service_healthy db: container_name: db image: mysql ports: - "3306" environment: MYSQL_ALLOW_EMPTY_PASSWORD: "yes" MYSQL_USER: "user" MYSQL_PASSWORD: "password" MYSQL_DATABASE: "database" healthcheck: test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] timeout: 20s retries: 10 

api容器不会启动,直到db容器健康(基本上直到mysqladmin启动并接受连接)。

如果你可以改变容器来等待mysql做好准备。

如果您没有控制要连接数据库的容器,则可以尝试等待特定的端口。

为此,我正在使用一个小脚本来等待另一个容器暴露的特定端口。

在这个例子中, myserver将等待mydb容器的端口3306可达。

 # Your database mydb: image: mysql ports: - "3306:3306" volumes: - yourDataDir:/var/lib/mysql # Your server myserver: image: myserver ports: - "....:...." entrypoint: ./wait-for-it.sh mydb:3306 -- ./yourEntryPoint.sh 

你可以在这里find脚本等待文档

我按照下面的例子修改了docker-compose.yml,它工作。

 mysql: image: mysql:5.6 ports: - "3306:3306" volumes: # Preload files for data - ../schemaAndSeedData:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: rootPass MYSQL_DATABASE: DefaultDB MYSQL_USER: usr MYSQL_PASSWORD: usr healthcheck: test: mysql --user=root --password=rootPass -e 'Design your own check script ' LastSchema 

在我的情况下../schemaAndSeedData包含多个架构和数据../schemaAndSeedData SQL文件。 Design your own check script可以类似于'select * from LastSchema.LastDBInsert'。

而依赖于Web的容器代码是

 depends_on: mysql: condition: service_healthy