作曲家文件中的Docker healthcheck

时间:2016-08-11 11:49:32

标签: docker docker-compose dockerfile

我尝试将新的健康检查集成到我的码头系统中,但我并不是真的知道如何以正确的方式做到这一点:/

问题是,我的数据库容器需要更多时间来启动并初始化数据库,然后启动我的主应用程序的容器。 结果:主容器无法启动正确,导致数据库连接丢失。 我编写了一个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 like:

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 Markus

3 个答案:

答案 0 :(得分:3)

一般情况下,您的应用程序应该能够处理不可用的资源,但是在启动的某些情况下,让一个容器等待另一个容器非常方便,并且#34;完全可用"。 Docker本身并不能为您处理,但有一些方法可以通过使用某些脚本延迟实际命令来处理资源使用容器中的启动。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

我认为这类似于Docker Compose wait for container X before starting Y

你的db_image需要支持curl 为此,请创建自己的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