作者:手机用户2502901401 | 来源:互联网 | 2023-02-10 10:44
我试图确保我的应用程序容器在db容器启动和READY TO接受连接之前不运行迁移/启动.
所以我决定使用healthcheck并依赖于docker compose file v2中的选项.
在应用程序中,我有以下内容
app:
...
depends_on:
db:
condition: service_healthy
另一方面,db具有以下健康检查
db:
...
healthcheck:
test: TEST_GOES_HERE
timeout: 20s
retries: 10
我尝试了几种方法,如:
确保创建db DIR
test: ["CMD", "test -f var/lib/mysql/db"]
获取mysql版本:
test: ["CMD", "echo 'SELECT version();'| mysql"]
Ping管理员(将数据库容器标记为健康,但似乎不是有效的测试)
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
有人有解决方案吗?
1> John Kariuki..:
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
在db容器运行正常之前,api容器才会启动(基本上直到mysqladmin启动并接受连接.)
仅供2017年人参加:版本3+不支持`depends_on`下的`condition`
如果服务器正在运行但尚未接受连接,则mysqladmin ping`将返回误报.
2> Capripot..:
如果您使用的是docker-compose v3 +,则已删除condition
的选项。depends_on
推荐的途径是使用相当wait-for-it
,dockerize
或者wait-for
。在docker-compose.yml
文件中,将命令更改为:
command: sh -c 'bin/wait-for db:3306 -- bundle exec rails s'
我个人比较喜欢,wait-for
因为它可以在Alpine容器中运行(sh
兼容,不依赖bash
)。缺点是它取决于netcat
,因此,如果您决定使用它,请确保已netcat
安装在容器中或将其安装在Dockerfile中,例如使用:
RUN apt-get -q update && apt-get -qy install netcat
我还分叉了该wait-for
项目,以便它可以检查健康的HTTP状态(使用wget
)。然后,您可以执行以下操作:
command: sh -c 'bin/wait-for http://api/ping -- jest test'
3> nono..:
如果您可以更改容器以等待mysql准备就绪.
如果您没有要将数据库连接到的容器的控件,则可以尝试等待特定端口.
为此,我使用一个小脚本来等待另一个容器暴露的特定端口.
在这个例子中,MYSERVER将等待端口3306的mydb的容器可到达.
# 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
您可以在此处找到脚本wait-for-it文档
警告:MySQL 5.5(可能还有较新的版本)仍可以在初始化时作出响应。
4> 小智..:
我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
包含多个模式和数据种子sql文件。Design your own check script
可以类似于以下内容select * from LastSchema.LastDBInsert
。
虽然网络依赖的容器代码是
depends_on:
mysql:
condition: service_healthy
警告:在撰写文件的“版本3”中,“条件”支持不再可用。参见https://docs.docker.com/compose/compose-file/#depends_on
5> Sylhare..:
您好,我使用docker-compose v2.1进行了简单的健康检查,我使用了:
/usr/bin/mysql --user=root --password=rootpasswd --execute \"SHOW DATABASES;\"
基本上,它运行的简单mysql
命令SHOW DATABASES;
使用,例如,在用户root
使用口令rootpasswd
在数据库中。
如果命令成功执行,则数据库已启动且已准备就绪,因此运行状况检查路径。您可以使用interval
它,以便每隔一段时间进行测试。
删除其他字段以提高可见性,这就是您的中的样子docker-compose.yaml
。
version: '2.1'
services:
db:
...
healthcheck:
test: "/usr/bin/mysql --user=root --password=rootpasswd --execute \"SHOW DATABASES;\""
interval: 2s
timeout: 20s
retries: 10
app:
...
depends_on:
db:
condition: service_healthy
6> Maksim Kostr..:
This should be enough
version: '2.1'
services:
mysql:
image: mysql
ports: ['3306:3306']
environment:
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
healthcheck:
test: mysqladmin ping -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD