健康检查时使用 docker compose 导致 MariaDB 本地主机失败

问题描述 投票:0回答:1

我正在开发基于 Debian 的 Virtual Box

我有 docker-compose yaml 文件:

version: '3' 
services:
  mydb:
    build: ./db/
    networks:
      - dockercompose-frontend 
    volumes:
      - server_db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=debian
    healthcheck:
      test: ['CMD", "mariadb-admin", "ping", "-h", "localhost"]
      interval: 10s 
      timeout: 15s 
      retries: 5

  frontend:
    build: .
      ports:
        - "8080:80"
      networks:
        - dockercompose-frontend
      environment:
        PMA_HOST=mydb
        PMA_PORT=3306

volumes:
  server_db:
    driver: local
networks:
  dockercompose-frontend:

每个服务都有两个 Dockerfile,我只在其中安装必要的映像。

FROM mariabd:latest
RUN apt-get update && apt-get install -y iputils-ping

FROM phpmyadmin:5.2.0-apache
RUN apt-get update && apt-get install -y iputils-ping

当我使用

docker compose up
(无-d模式)时:

frontend-1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain nam e, using 172.25.0.2. Set the ServerName directive globally to suppress this message

当我使用

docker compose up -d
并检查 mydb 的健康状态时,它会抛出:

{
  "Status":"starting", 
  "FailingStreak": 2, 
  "Log": [{"Start": "2024-02-19T10:05:48.178379963-05:00",
    "End": 2024-02-19T10:05:48.240662846-05:00", 
    "ExitCode": 1, 
    "Output":"\u0007mariadb-admin: connect to server a t 'localhost failed\nerror: 'Can't connect to local server through socket '/run/mysqld/mysqld.sock (2) 
    'Check that mariadbd is running and that the socket: '/run/mysqld/mysqld.sock' exists!"
}

还有,

docker exec dockercompose-mydb-1 service mariadb status

抛出“Mariadb 服务已停止”

之后

docker exec dockercompose-mydb-1 service mariadb start

它抛出退出代码 1(失败)。

docker docker-compose mariadb
1个回答
0
投票

首先,更新健康检查部分的语法,因为引号中存在错误

healthcheck:
  test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
  interval: 10s
  timeout: 15s
  retries: 5

第二个指定mariadb服务中的端口

version: '3' 
services:
  mydb:
    build: ./db/
    networks:
      - dockercompose-frontend 
    volumes:
      - server_db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=debian
    healthcheck:
      test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
      interval: 10s 
      timeout: 15s 
      retries: 5
    ports:
      - "3306:3306"  # Map container's port 3306 to host's port 3306

  frontend:
    build: .
    ports:
      - "8080:80"
    networks:
      - dockercompose-frontend
    environment:
      PMA_HOST: mydb
      PMA_PORT: 3306

volumes:
  server_db:
    driver: local
#rest of your docker comopse file

还要确保网络驱动程序不等于none,例如它的类型等于bridge。

您可以在前端服务中添加“depends_on”,这样除非 mariaDB 成功启动,否则不会创建容器。

  frontend:
    build: .
    ports:
      - "8080:80"
    networks:
      - dockercompose-frontend
    environment:
      PMA_HOST: mydb
      PMA_PORT: 3306
    depends_on:
      - mydb  # to prevent docker compose from starting the container until the container of mariaDB is running.
© www.soinside.com 2019 - 2024. All rights reserved.