作曲文件中的Docker健康检查

我尝试将新的健康检查集成到我的泊坞窗系统中,但是我不知道如何以正确的方式进行操作:

问题是,我的数据库容器需要更多的时间来启动和初始化数据库,然后启动我的主应用程序的容器。 结果是:主容器不会正确启动,导致缺less数据库连接。 我编写了一个healthcheck.sh脚本来检查数据库容器的连通性,因此主容器在连接可用后开始启动。 但是我不知道如何正确地将它集成到Dockerfile和我的docker-compose.yml中

healthcheck.sh就像:

#!bin/bash COUNTER=0 while [[ $COUNTER = 0 ]]; do mysql --host=HOST --user="user" --password="password" --database="databasename" --execute="SELECT 1"; if [[ $? == 1 ]]; then sleep 1 echo "Let's sleep again" else COUNTER=1 echo "OK, lets go!" fi done 

mysql容器Dockerfile:

 FROM repository/mysql-5.6:latest MAINTAINER Me ... some copies, chmod and so on VOLUME ["/..."] EXPOSE 3306 CMD [".../run.sh"] HEALTHCHECK --interval=1s --timeout=3s CMD ./healthcheck.sh 

docker-compose.yml像:

 version: '2' services: db: image: db image restart: always dns: - 10. ports: - "${MYSQL_EXTERNAL_PORT}:${MYSQL_INTERNAL_PORT}" environment: TZ: Europe/Berlin data: image: data image main application: image: application image restart: always dns: - 10. ports: - "${..._EXTERNAL_PORT}:${..._INTERNAL_PORT}" environment: TZ: Europe/Berlin volumes: - ${HOST_BACKUP_DIR}:/... volumes_from: - data - db 

我需要做些什么来将此健康检查集成到我的docker-compose.yml文件中才能正常工作? 或者还有其他的机会推迟我主容器的启动吗?

Thx马库斯

由于docker-compose 1.10.0,您可以在撰写文件中指定健康检查: https : //github.com/docker/docker.github.io/blob/master/compose/compose-file.md#healthcheck

它利用https://docs.docker.com/engine/reference/builder/#/healthcheck这已经引入了Docker 1.12

一般而言,您的应用程序应该能够处理不可用的资源,但是也有一些情况下启动时,有一个容器等待另一个容器“完全可用”是非常方便的。 Docker本身并不为你处理,但是有一些方法可以通过延迟实际的命令来处理资源使用容器中的启动。

有一个postgresql启动检查的一个很好的例子,可以在任何需要等待数据库“完全启动”的容器中使用。 请参阅docker文档中的代码示例: https : //docs.docker.com/compose/startup-order/

我相信这是类似于Docker Compose在启动Y之前等待容器X.

你的db_image需要支持curl。
要做到这一点,创build自己的db_image为:

 FROM base_image:latest RUN apt-get update RUN apt-get install -y curl EXPOSE 3306 

那么你应该需要的是一个docker-compose.yml,看起来像这样:

 version: '2' services: db: image: db_image restart: always dns: - 10. ports: - "${MYSQL_EXTERNAL_PORT}:${MYSQL_INTERNAL_PORT}" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:${MYSQL_INTERNAL_PORT}"] interval: 30s timeout: 10s retries: 5 environment: TZ: Europe/Berlin main_application: image: application_image restart: always depends_on: db: condition: service_healthy links: - db dns: - 10. ports: - "${..._EXTERNAL_PORT}:${..._INTERNAL_PORT}" environment: TZ: Europe/Berlin volumes: - ${HOST_BACKUP_DIR}:/... volumes_from: - data - db