安爸-超级家庭

Dify镜像相关操作:构建、导入、导出等

安爸 发布于

本文使用Dify v0.6.14版本,主要介绍了Dify镜像的构建、导入、导出等操作,以及通过Docker Compose部署和更新Dify

一.dify/dify-api:0.6.14

1.构建镜像

cd api && docker build . -t dify/dify-api:0.6.14

2.导出镜像

docker save -o dify_dify_api_0.6.14.tar dify/dify-api:0.6.14

3.导入镜像

docker load -i dify_dify_api_0.6.14.tar

二.dify/dify-web:0.6.14

1.构建镜像

cd web && docker build . -t dify/dify-web:0.6.14

2.导出镜像

docker save -o dify_dify_web_0.6.14.tar dify/dify-web:0.6.14

3.导入镜像

docker load -i dify_dify_web_0.6.14.tar

三.其它镜像

1.导出镜像

docker save -o postgres_15_alpine.tar postgres:15-alpine docker save -o redis_6_alpine.tar redis:6-alpine docker save -o langgenius_dify_sandbox_0_2_1.tar langgenius/dify-sandbox:0.2.1 docker save -o ubuntu_squid_latest.tar ubuntu/squid:latest docker save -o semitechnologies_weaviate_1_19_0.tar semitechnologies/weaviate:1.19.0 docker save -o nginx_latest.tar nginx:latest docker save -o dify_dify_api_0.6.14.tar dify/dify-api:0.6.14 docker save -o dify_dify_web_0.6.14.tar dify/dify-web:0.6.14

2.导入镜像

docker load -i postgres_15_alpine.tar docker load -i redis_6_alpine.tar docker load -i langgenius_dify_sandbox_0_2_1.tar docker load -i ubuntu_squid_latest.tar docker load -i semitechnologies_weaviate_1_19_0.tar docker load -i nginx_latest.tar docker load -i dify_dify_api_0.6.14.tar docker load -i dify_dify_web_0.6.14.tar

四.通过Docker Compose部署

1.Docker Compose部署 [2]

cd dify/docker cp .env.example .env docker compose up -d

2.更新dify/docker内容 [2]

`cd dify/docker
docker compose down

备份docker目录

导入镜像

更新.env文件

更新docker-compose.yaml文件

docker compose up -d
`

五.迁移卷目录和数据卷

1.迁移卷目录

通过docker-compose.yaml文件可看到,有不少服务是通过”本地目录映射”进行数据持久化,迁移方式即拷贝。

(1)停止所有服务

docker-compose down

(2)打包传输卷目录

tar -czvf dify-volumes.tar.gz ./volumes

(3)在服务器上解压

tar -xzvf dify-volumes.tar.gz

2.迁移数据卷

通过docker-compose.yaml文件可看到,有些服务采用”数据卷”来实现数据持久化。迁移方式要稍微复杂一些,以oradatadify_es01_data为例进行讲解。

(1)找到卷的位置

这会显示卷的物理存储路径,通常在 /var/lib/docker/volumes/ 目录下。

docker volume inspect oradata dify_es01_data

特别说明:

当使用 docker compose -p dify 命令指定项目名为 “dify” 时,Docker Compose 会自动在所有创建的资源(包括卷、容器和网络)名称前添加项目名作为前缀。

(2)备份数据卷内容

方法1:创建中转容器(推荐)

# 创建临时容器连接卷并将数据复制到本地 docker run --rm -v oradata:/source -v $(pwd)/backup:/backup alpine sh -c "cd /source && tar czf /backup/oradata.tar.gz ." docker run --rm -v dify_es01_data:/source -v $(pwd)/backup:/backup alpine sh -c "cd /source && tar czf /backup/es_data.tar.gz ."

方法2:如果有root权限,直接操作卷目录

`# 获取卷的挂载点
ORADATA_PATH=$(docker volume inspect -f '{{.Mountpoint}}' oradata)
ES_DATA_PATH=$(docker volume inspect -f '{{.Mountpoint}}' dify_es01_data)

打包数据

sudo tar -czf oradata_backup.tar.gz -C $ORADATA_PATH .
sudo tar -czf es_data_backup.tar.gz -C $ES_DATA_PATH .
`

(3)将备份文件传输到服务器

scp oradata_backup.tar.gz es_data_backup.tar.gz user@server:/path/to/destination

(4)在服务器上创建新的数据卷并恢复数据

`# 在服务器上创建卷
docker volume create oradata
docker volume create dify_es01_data

恢复数据

docker run --rm -v oradata:/target -v /path/to/destination:/backup alpine sh -c "cd /target && tar xzf /backup/oradata_backup.tar.gz"
docker run --rm -v dify_es01_data:/target -v /path/to/destination:/backup alpine sh -c "cd /target && tar xzf /backup/es_data_backup.tar.gz"
`

六.相关知识点

1.docker和docker-legacy

由于历史遗留问题,在Dify源码目录下存在docker(推荐新建)和docker-legacy(历史旧的)两个目录,具体区别和联系详细参考文献[1]。

2.privkeys和SECRET_KEY

(1)dify\api\storage\privkeys

创建租户的时候generate_key_pair()生成的。

(2)dify\api\.env中的SECRET_KEY

SECRET_KEY是一个用于签名会话 cookie的密钥,通常用于应用程序的安全性配置。

3.镜像忽略storage目录

通过Dockerfile打包Dify镜像时,会忽略storage目录,因为该目录包含隐私信息。

4.docker run --rm通用命令模版

(1)通用命令模板

docker run --rm \   -v <host_volume_or_path>:<container_path> \   -v <host_backup_dir>:<container_backup_path> \   <image_name> \   sh -c "<shell_commands_inside_container>"

组件 含义与用途
docker run 启动一个临时容器实例
–rm 容器执行完毕后自动删除,避免临时容器堆积
-v : 把主机目录或卷 A 挂载到容器内 B 路径,支持多个 -v
<image_name> 容器使用的基础镜像,例如 alpine、ubuntu
sh -c “…” 在容器内运行一条 shell 命令,例如 tar、cp、ls 等

(2)示例1:从Docker卷打包备份到主机

将 Docker 卷 mydata 中的所有内容打包成 mydata.tar.gz,输出到当前主机目录。

docker run --rm \   -v mydata:/source \   -v $(pwd):/backup \   alpine \   sh -c "cd /source && tar czf /backup/mydata.tar.gz ."

(3)示例2:还原压缩包到数据卷

将主机目录下的压缩包解压到名为 mydata 的数据卷中。

docker run --rm \   -v mydata:/target \   -v $(pwd):/backup \   alpine \   sh -c "cd /target && tar xzf /backup/mydata.tar.gz"

(4)恢复数据示例

使用Docker,将一个压缩备份文件oradata_backup.tar.gz解压到名为oradataDocker数据卷中。

docker run --rm \   -v oradata:/target \   -v /path/to/destination:/backup \   alpine \   sh -c "cd /target && tar xzf /backup/oradata_backup.tar.gz"

命令 解释
docker run 运行一个新的 Docker 容器
–rm 容器运行结束后自动删除(不保留临时容器)
-v oradata:/target 将名为 oradata 的 Docker 数据卷 挂载到容器内的 /target 路径
-v /path/to/destination:/backup 将宿主机目录 /path/to/destination(其中包含 .tar.gz 备份文件)挂载为容器内的 /backup 路径
alpine 使用 Alpine Linux 作为运行镜像(轻量,默认包含 tar)
sh -c “cd /target && tar xzf /backup/oradata_backup.tar.gz” 在容器中运行 shell 命令:进入 /target,并将压缩包解压到该目录下

参考文献

[0] Dify镜像相关操作:构建、导入、导出等:https://z0yrmerhgi8.feishu.cn/wiki/U5ZfwGzJ8iyHqKkRg1Nc4mAanNf

[1] Dify的Docker部署指南 (中文翻译):https://z0yrmerhgi8.feishu.cn/wiki/GDscwWIeiir986kTkyNcIZZAnpe

[2] Docker Compose部署:https://docs.dify.ai/zh-hans/getting-started/install-self-hosted/docker-compose


知识星球:Dify源码剖析及答疑,Dify扩展系统源码,AI书籍课程|AI报告论文,公众号付费资料。加微信buxingtianxia21进NLP工程化资料群,以及Dify交流群。

(文:NLP工程化)

Dify镜像相关操作:构建、导入、导出等最先出现在每时AI


扫描二维码,在手机上阅读