使用的是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
自动重启不健康应用。
手动安装或者从这里添加安装
我按这种添加了,重启服务器,还是不能正确的连接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升级中断服务或宕机了,你这种方式还不是一样的。
只能说是重启服务器后的一种解决方式。
感觉还是检测不健康就重启的方式好一些。
检测不健康的方式,要改成是否可以打开数据库就好了, 光是可以连接没用啊, 就没有完美一点的解决方案吗
那就自己写脚本咯