Docker-compose检查mysql连接是否准备就绪
我试图确保我的应用程序容器不运行迁移/启动,直到数据库容器启动,并准备接受连接。
所以我决定使用健康检查,并取决于泊坞窗撰写文件v2中的选项。
在应用程序中,我有以下
app: ... depends_on: db: condition: service_healthy
数据库另一方面有以下健康检查
db: ... healthcheck: test: TEST_GOES_HERE timeout: 20s retries: 10
我已经尝试了几个方法,如:
- 确保db DIR被创build
test: ["CMD", "test -f var/lib/mysql/db"]
- 获取mysql版本:
test: ["CMD", "echo 'SELECT version();'| mysql"]
- 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