重启服务器后,容器启动顺序问题

使用的是v1.8.2版本
我安装了 Answer 是使用的mysql数据库, 但是我重启服务器后, Answer的日志显示 connection database failed: dial tcp 172.18.0.2:3306: connect: connection refused , ( 重启容器可以正常) 这种情况应该是先启动的 Answer 然后再启动的mysql, 这个要怎么解决呢, 怎么自定义容器的启动顺序呢.

你应该使用容器名或者主机名方式连接,而不是IP方式,

IP方式未设置为静态的,重启docker后IP会变。

数据库连接信息查看数据库管理模块

是使用mysql容器方式连接的,重启容器则正常, 这是别人也有这个问题,我们在1panel上要怎么解决呢? 解决重启之后重定向50x页面 · Issue #472 · apache/incubator-answer (github.com)

1. 添加健康检测

    healthcheck:
      test: ["CMD", "sh", "-c", "nc -z mysql 3306 || exit 1"]
      interval: 10s
      retries: 3
      timeout: 5s

编辑应用参数,高级设置,勾选编辑compose,填入以下,然后重建,其中mysql主机名按需修改

version: '3'
services:
  answer:
    container_name: ${CONTAINER_NAME}
    restart: always
    networks:
      - 1panel-network
    ports:
      - "${PANEL_APP_PORT_HTTP}:80"
    volumes:
      - "./data:/data"
    image: answerdev/answer
    healthcheck:
      test: ["CMD", "sh", "-c", "nc -z mysql 3306 || exit 1"]
      interval: 10s
      retries: 3
      timeout: 5s
    labels:  
      createdBy: "Apps"

networks:  
  1panel-network:  
    external: true

2. 安装autoheal

通过autoheal自动重启不健康应用。

手动安装或者从这里添加安装

1 个赞

我按这种添加了,重启服务器,还是不能正确的连接mysql,下面是我操作的过程

我手动验证健康检查是生效的:
停止mysql容器,可以在DockerAutoheal容器的日志看到如下内容:
17-11-2023 02:35:38 Container /Answer (6432809ef8f5) found to be unhealthy - Restarting container now with 10s timeout
在Answer容器里也能看到日志如下内容:
connection database failed: dial tcp: lookup mysql on 127.0.0.11:53: no such host
但是当我启动Mysql容器的时候,Answer仍然是没有连接到mysql的,
这时候我手动重启一次Answer容器就能正确连接到mysql数据库

对啊,他就是当不健康的时候代替你重启容器。

健康检测你可以再调频繁一些

调到1秒一次也不行, 就算调频繁行的话,这样也不严谨啊, 不能保证100%有用,
或者检测条件不能只是是否可以连接,应该要是否可以使用,

检测异常不健康就重启还觉得不够,

那就把mysql写到一个docker-compose.yml文件里,用depends_on:咯,

你估计又感觉不方便了吧……

现在是这样用的可以正常, 用entrypoint指令强制覆盖原有容器启动命令,让容器睡30秒再启动web服务

networks:
    1panel-network:
        external: true
services:
    Answer:
        container_name: ${CONTAINER_NAME}
        deploy:
            resources:
                limits:
                    cpus: ${CPUS}
                    memory: ${MEMORY_LIMIT}
        entrypoint: sh -c "sleep 30&&/entrypoint.sh"
        image: answerdev/answer:1.2.0
        labels:
            createdBy: Apps
        networks:
            - 1panel-network
        ports:
            - ${HOST_IP}:${PANEL_APP_PORT_HTTP}:80
        restart: always
        volumes:
            - ./data:/data
version: "3"

这不就原issue提供的解决方案么,但是假如MySQL升级中断服务或宕机了,你这种方式还不是一样的。

只能说是重启服务器后的一种解决方式。

感觉还是检测不健康就重启的方式好一些。

检测不健康的方式,要改成是否可以打开数据库就好了, 光是可以连接没用啊, 就没有完美一点的解决方案吗

那就自己写脚本咯