dify使用Docker部署,在访问时可能会出现502 Bad Gateway的问题。
官方文档的常见问题中最下面提到了这个问题并给出了原因和解决办法,但是治标不治本,每次重启都要手动操作一次,太麻烦了。
如果不能从根本上解决这个问题,可以写个脚本每次重启时执行一下。在这个脚本中执行解决办法中的步骤,即找到docker-web-1和docker-api-1这俩容器的IP,替换default.conf
中的值,再重启docker-nginx-1容器即可。
说干就干,使用Python语言来操作,获取容器的IP可以使用docker
package.
首先安装docker
package:
pip3 install docker
再把如下内容保存为Python脚本:
# coding=utf-8
import docker
client = docker.from_env()
container_list = client.containers.list()
print(container_list)
# 读取文件
def file_get_contents(file_path):
with open(file_path, "r", encoding="utf-8") as file:
return file.read()
# 写入文件
def file_put_contents(file_path, content):
with open(file_path, "w", encoding="utf-8") as file:
file.write(content)
# 获取容器IP
def get_container_ip(container_name):
container = client.containers.get(container_name)
return container.attrs['NetworkSettings']['Networks']['docker_default']['IPAddress']
# 重启容器
def restart_container(container_name):
container = client.containers.get(container_name)
container.restart()
def main():
api_container_ip = get_container_ip('docker-api-1')
web_container_ip = get_container_ip('docker-web-1')
print(f'api_container_ip {api_container_ip}')
print(f'web_container_ip {web_container_ip}')
# 模板读取与替换
tpl_contents = file_get_contents('default.tpl.conf')
tpl_contents = tpl_contents.replace('http://api', f'http://{api_container_ip}')
tpl_contents = tpl_contents.replace('http://web', f'http://{web_container_ip}')
# 写入配置
file_put_contents('conf.d/default.conf', tpl_contents)
restart_container('docker-nginx-1')
if __name__ == '__main__':
main()
我这里是把dify/docker/nginx/conf.d/default.conf
拿到上一层目录并命名为default.tpl.conf
,Python脚本位于同一目录下,每次重启后待Docker服务完全启动后,执行这个脚本即可:
cd dify/docker/nginx;
python3 dify-nginx.py;